【转】Android开发之数据库SQL

 android中的应用开发很难幸免不去采取数据库,此次就和我们聊聊android中的数据库操作。

 

一、android内的数据库的基础知识介绍

 

       1.用了什么样数据库

           
android中采用的数据库是SQLite以此轻量级的嵌入式开源数据库,它是用c语言营造的。相关简介可以从链接查看。

 

       2.数据库基本知识观花

           
对于一些和本身一样还没有当真系统学习数据库技术的同桌来说,把SQL92标准中的一些基本概念、基本语句快捷的询问一下,是很有要求的,那样待会用Android的database相关方法去实践一些数据库语句时就不会茫然了。

 

       ①数据库的基本结构——表格

 

       表格是数据库中贮存资料的中坚架构。表格被分成栏位 (column) 及列位
(row)。每一列代表一笔资料,而每一栏代表一笔资料的一部份。举例来说,如若大家有1个记载顾客资料的报表,那栏位就有恐怕包罗姓、名、地址、城市、国家、生日...等等。每三个报表拥有一个满世界无双的名字(Table
Name)以便能够让用户定位到它上面。一个超级的报表结构如下:

 

   Store_Information 表格

store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999

 该表格的报表名字为Store_Information,一共有八个栏位,分别为store_name
, Sales , Data ,已经录入了四笔数目所以有多个列位。

 

       ②关于数据类型

 

      
和其它的数据库差异的是,sqlite是无类型的。也正是当您成立三个报表时,无需对每贰个栏位要存款和储蓄的多寡的门类进行宣示,当您在给表格扩张数据条目时,sqlite会自动找到存入的数量的品种。

 

       SQLite允许忽略数据类型,可是,如故建议在Create
Table语句中钦命数据类型,因为数据类型有利于狠抓程序的可读性。SQLite协理广大的数据类型,如VA安德拉CHAPRADO、NVAEscortCHA奥迪Q⑤ 、TEXT、
INTEGE奥迪Q7、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMELX570IC、VA本田CR-VYING、CHARACTERAV4、NATl0NAI,
VA奥迪Q5YINGCHARACTEKoleos。那一个数据类型都是SQL92标准中明确的专业数据库数据类型,想要有更近一步精晓,请参见下表。

 

 

SQL数据库数据类型详解

 

数据类型 类型 描             述
bit 整型 bit 数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或Fa lse 、On 或Off
int 整型 int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占用4个字节
smallint 整型 smallint 数据类型可以存储从- 215(-32768)到215(32767)之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间
tinyint 整型 tinyint 数据类型能存储从0到255 之间的整数。它在你只打算存储有限数目的数值时很有用。 这种数据类型在数据库中占用1 个字节
numeric 精确数值型 numeric数据类型与decimal 型相同
decimal 精确数值型 decimal 数据类型能用来存储从-1038-1到1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。 范围是小数点左右所能存储的数字的总位数。精度是小数点右边存储的数字的位数
money 货币型 money 数据类型用来表示钱和货币值。这种数据类型能存储从-9220亿到9220 亿之间的数据,精确到货币单位的万分之一
smallmoney 货币型 smallmoney 数据类型用来表示钱和货币值。这种数据类型能存储从-214748.3648 到214748.3647 之间的数据,精确到货币单位的万分之一
float 近似数值型 float 数据类型是一种近似数值类型,供浮点数使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308到1.79E+308 之间的任意数
real 近似数值型 real 数据类型像浮点数一样,是近似数值类型。它可以表示数值在-3.40E+38到3.40E+38之间的浮点数
datetime 日期时间型 datetime数据类型用来表示日期和时间。这种数据类型存储从1753年1月1日到9999年12月3 1日间所有的日期和时间数据, 精确到三百分之一秒或3.33毫秒
Smalldatetime 日期时间型 smalldatetime 数据类型用来表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟
cursor 特殊数据型 cursor 数据类型是一种特殊的数据类型,它包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用
timestamp 特殊数据型 timestamp 数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。 一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”, 但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的
Uniqueidentifier 特殊数据型 Uniqueidentifier数据类型用来存储一个全局唯一标识符,即GUID。GUID确实是全局唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID 函数或转换一个字符串为唯一标识符来初始化具有唯一标识符的列
char 字符型 char数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000 个字符
varchar 字符型 varchar数据类型,同char类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。 它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度
text 字符型 text 数据类型用来存储大量的非统一编码型字符数据。这种数据类型最多可以有231-1或20亿个字符
nchar 统一编码字符型 nchar 数据类型用来存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍
nvarchar 统一编码字符型 nvarchar 数据类型用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍
ntext 统一编码字符型 ntext 数据类型用来存储大量的统一编码字符型数据。这种数据类型能存储230 -1或将近10亿个字符,且使用的字节空间增加了一倍
binary 二进制数据类型 binary数据类型用来存储可达8000 字节长的定长的二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型
varbinary 二进制数据类型 varbinary 数据类型用来存储可达8000 字节长的变长的二进制数据。当输入表的内容大小可变时,你应该使用这种数据类型
image 二进制数据类型 image 数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节

 

您或然已经在纳闷了,为何事先的数据类型是大写的,而到了那一个表格就改成了小写的。其实这是sqlite的1个不得不提的特征:sqlite是高低写不灵活的!这一性格对于众多c语言fans来说是很不习惯的。

 

        ③数据库的着力操作语句



 

      
其实那几个照旧SQL92标准中的一有些,只是不相同的数据库会有一丢丢的比不上而已,上边就对在android中最常用的多少个操作语句给以概述,详细介绍请参考SQL语句不难介绍

 

(1)CREATE TABLE

       由于创造二个表格,基本选拔语法结构是:

CREATE TABLE “表格名” (“栏位1” 保存资料类型 , “栏位3”  保存资料类型
 , “栏位2” 保存资料类型 …..);

       例如笔者要创设刚才的Store_Information表格,就足以那样:

CREATE TABLE  Store_Information (Store_Name char[50] , Sales long
, Date date );  

      
须求提示的是,那里依旧注解了数据类型。而且简单窥见,c语言构建的sqlite自个儿也有一些c语言的心性(例如一个完好无损语句后的分店)。

 

 

(2)SELECT

用于将资料从数据库中的表格内选出,基本语法结构为:

**SELECT “栏位名” FROM “表格名” ;**

譬如笔者想将 Store_Information 里面的store_name 选出,则足以如此:

SELECT store_name FROM Store_Information ;

 

那句执行后就会显得如下的音信:

 

 

store_name
Los Angeles
San Diego
Los Angeles
Boston

 

 

好了,效果一目领会。

 

(3)SELECT语句能够添加条件来压缩选取结果:

 

 

去掉重复的结果:

 

SELECT DISTINCT “栏位名” FROM “表格名” **

 

比如说将刚刚的语句改为:

 

SELECT DISTINCT store_name FROM Store_Information ;

 

则显示的结果为:

 

store_name

Los Angeles
San Diego
Boston

 

贯彻有原则的筛选:

 

SELECT “栏位名” FROM “表格名” WHERE “条件语句” ;

 

规范语句和c语言中的类似,只不过用AND表示“且”,ORAV4代表“或”。

 

譬如说对表执行如下语句:

 

SELECT store_name FROM Store_Information WHERE Sales > 1000 ;

 

则显得结果为:

 

 

 

store_name 

 

Los Angeles

 

 

其间WHERE语句用的较多,因为它能够实现自定义规则的运用和多规格的构成。

 

(4)INSERT INTO

 

在报表中参与资料——能够完毕一笔的进入和多笔的进入。

 

加盟一笔:

INSERT INTO “表格名” (“栏位1”, “栏位2”, …) VALUES (“值1”, “值2”,
…);

加入多笔:

INSE宝马X3T INTO “待参预数据的表格” (“栏位1”, “栏位2”, …) SELECT “栏位3”,
“栏位4”, … FROM “被投入的表格” ;

 

加盟多笔其实正是将另3个报表参预到存活表格中。

 

(5)UPDATE**

 

用来修改表格中的数据,语法结构为:

 

UPDATE “表格名” SET “栏位1” = [新值] WHERE {条件};

 

例如:

 

UPDATE Store_Information SET Sales = 500 WHERE store_name = “Los
Angeles” AND Date = “Jan-08-1999” ;

 

切切实实是怎么样意思的话就背着了,你懂的~~~

 

(6)DELETE FROM**

 

sqlite,除去表格中的有个别数据,语法结构为:

 

DELETE FROM “表格名” WHERE {条件} ;

 

满意条件的有着资料都会被去除掉。

 

 

 

 

二、怎么在android中调用数据库能源

在android中首要有二种办法来兑现对数据库的拜访,一种是adb
shell方式,另一种是通过相关的android
的java类来直接的对数据库来拓展操作。在那之中前者首要用于在支付进程中开始展览调节等工作,后者则为android中相当重要的利用数据库的艺术。

上面就对那二种方法开始展览三个简约的牵线。

 

1.adb shell方式

 

差不多,adb shell
正是贰个android模拟器的后台湾资金源调用器(个人精晓啊~~)。它的操作格局和命令提示符大多——以命令行的艺术展开。

 

既然如此是模拟器的后台湾资金源调用器,这自然得先开辟android模拟器了。

 

打开模拟器后,再打开命令提醒符,在个中输入adb
shell
,那时会产出1个#号(懂linux的同窗懂的),具体作用如下:

 

sqlite 1

下一场您就足以像在linux下举行shell命令的进行了。

 

继之输入 cd data/data/
并施行,再实施ls,则会议及展览示一些设置的软件的工程包名,效果如下:

 

sqlite 2

 

骨子里这在模拟器中是以二个个文书夹的情势存在的,所以您能够用cd命令进入它。例如我进来三个后,再用ls命令突显当中的内容:

 

 

sqlite 3

该文件夹内又存在databases、
lib等公事夹(假诺没有databases的话能够协调手动用mkdir命令创建2个)。而那么些databases文件夹正是这么些利用的数据库文件的所在地,cd进入后,应该会合到个中有一个或多个.db格式的文本(其实sqlite对文本的名字没有特殊须要,你用.txt等任何的格式也得以,但推荐.db)。假如没有db文件的话,能够用如下命令创立:sqlite3
mydata.db。这样就会在databases里不熟悉成了2个数据库文件。即使已存在,能够间接用sqlite3命令调用该数据库文件,命令为
sqlite3 mydata.db(其实正是和刚刚的通令3个样)。接下来你就会看出:

 

sqlite 4

 

在sqlite>后边就足以实施你的sql语句了。下边执行了部分粗略的言辞:

 

sqlite 5

 

好了,adb shell的办法介绍到此地。

 

2.经过android中的相关java类

 

 

     
Android中对数据库进行操作的连带的假说、类等都在andorid.database和android.database.sqlite四个包里面。里面存在着很多的与数据库操作相关的类,可是在通平日见的付出中最平日遭遇的一味正是那些类而已,所以在那里笔者就省去通篇的介绍,对有的常用的接口、类做一下简介。

 

SQLiteDatabase(android.database.sqlite.SQLiteDatabase)

 

文档消息:

public class

SQLiteDatabase

 

Exposes methods to manage a SQLite database.SQLiteDatabase has methods
to create, delete, execute SQLcommands, and perform other common
database management tasks.atabase names must be unique within an
application, not across all applications.

 

 

简介:

那一个是在android中数据库操作使用最频仍的七个类。通过它能够兑现数据库的成立或打开、创制表、插入数据、删除数据、查询数据、修改数据等操作。

 

关键艺术介绍:

 

(1)public
static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)

     public
static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)

其一措施用于打开或创办三个数据库(对于sqlite来说,正是开辟或爆发二个数据库文件),参数中的File类正是java中象征系统文件路径的File类,而SQLiteDatabase.CursorFactory则是八个发生Cursor指标的工厂类(Cursor接口将在背后介绍到)。

(2)public long insert (String table, String nullColumnHack, ContentValues values)

看来它的名字以及sql中的相关语句你不难猜到这么些点子用于在数据库中加入数据。ContentValue类似于java中HashMap类,用于以键值对的办法保留数据。

(3)public int delete (String table, String whereClause, String[] whereArgs)

毫不说了,用于删除表中的数额。

(4)public Cursor query (booleandistinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

名字十分长是吗,它的效益也很强劲,用于查询数据库中的数据。

(5)public int update (String table, ContentValues values, String whereClause, String[] whereArgs)

用于修改数据。依照传入参数的名字能够对运用办法知情。

(6)public void execSQL (String sql, Object[] bindArgs)

  
  public void execSQL (String sql)

这是本人个人认为最棒根本的章程。那些方式用于实践你用String表示的非查询(因为它不会再次回到叁个Cursor对象)的sql语句,例如CREATE,SELECT等。遗憾的是明日尚不能够3遍调用该措施来实施用“;”分开的多条sql语句。第③个重写方法应用的越来越多些。

除此以外在此提问:第一个重写方法中bindArgs表示的是局地什么样,用来做哪些用,知道的同学可以告诉作者下,谢谢!

(7)public void close ()

用来关闭数据库并释放数据库占用的相干财富。

 

SQLiteOpenHelper (android.database.sqlite.SQLiteOpenHelper)

 

文书档案音讯:

public abstract class

SQLiteOpenHelper

A helper class to manage database creation and version management. You
create a subclass
implementingonCreate(SQLiteDatabase)onUpgrade(SQLiteDatabase,
int, int)
 and optionally onOpen(SQLiteDatabase), and this class
takes care of opening the database if it exists, creating it if it does
not, and upgrading it as necessary. Transactions are used to make sure
the database is always in a sensible state.

 

简介:

正如它的名字所公布的等同,那些抽象类是贰个协理类(Helper),用来开辟(若数据库已存在)或创立数据库的。关于抽象类大家都知情,要是要采纳它,一定是三番肆遍它。所以接纳它都以由此祥和定义一个类继承于它,并达成onCreate(SQLiteDatabase) onUpgrade(SQLiteDatabase,
int, int) 
onOpen(SQLiteDatabase)多少个点子。

在笔者眼里,所谓的协理类,其实便是充当了叁个封装器——也正是说用于对其帮助的类达成叁个java上的包裹。在此间,SQLiteOpenHelper就算用来对SQLiteDatabase开始展览七个卷入处理。初学的校友想要进一步掌握的话可以先看看怎么样是包裹

 

它包涵的情势如下:

 

(1)synchronized void close()

      关闭其余已打开的数据库对象。

(2)synchronized SQLiteDatabase getReadableDatabase()

      创立或打开一个只是可读的(read-only)数据库。

(3)synchronized SQLiteDatabase getWritableDatabase()

      创设或打开1个可读可写的数据库。

(4)abstract void onCreate(SQLiteDatabase db)

     
当数据库被第贰遍创建时被调用的的方式(类似于Activity的onCreate())。

(5)void onOpen(SQLiteDatabase db)

      数据库已经被成打开后被调用。

(6)abstract void onUpgrade(SQLiteDatabase db, int oldVersion,
int
 newVersion)

      当数据库供给被改变(更新)时被调用。

 

 

Cursor(android.database.Cursor)

 

文书档案音信:

public interface

Cursor

This interface provides random read-write access to the result set
returned by a database query.

 

简介:

Cursor尚无构造方法,只可以通过query主意取得。

前方提到了,execSQL方法不可能推行与查询相关的sql语句,是因为不能够重回二个Cursor对象——查询要求将查到的结果(正是表中的哪一行知足查询条件)重返,execSQL是再次回到void的,所以无法操作查询语句。从那边能够掌握到,Cursor接口从某种意义上说就是为着弥补那或多或少的——query措施就是回到了三个Cursor目的。从名字上看,它的趣味是游标,所以大概能够猜到他起到了一个替代的效用(事实上正是的,它代替数据库中保存数据的表的一行,并且还足以回顾的处理该行数据项的音讯)。从类的叙述看,Cursor提供了对3个数据库查询动作重临结果束的随机读写途径,相当于说,它是三个对查询操作重返结果开始展览更为处理的类,而那几个处理正是用Cursor里的主意完结的。

组合SimpleCursor艾达pter这些适配器类,你能够很有益的将数据库中的数据突显到AdapterView(例如ListView,GridView)中——那也是Cursor的另一大用处。

万一您掌握java中的迭代器(Iterator)的话你就会发觉其实Cursor和迭代器有个别相似,那样您大概会更快的打听Cursor

 

有些常用的方式有:

(1)public
abstract boolean moveToPosition (int position)

    public
abstract boolean moveToFirst ()

    public
abstract boolean moveToLast ()

    public
abstract boolean moveToNext ()

    public
abstract boolean moveToPrevious ()

把这几个措施放在一起的目标很显眼:它们都以对Cursor针对的岗位举办操作的章程——移到有个别钦点的任务、移到第①行、移到结尾一行、移向下一行、移向上一行等等。

 

(2)public
abstract int getCount ()

回来Cursor指向的表含有的总数据项数。

 

(3)public
abstract boolean requery ()

Cursor是被三个query方法发生的,而那几个点子就是将卓殊query措施所做的查询动作再实施一回——那将会变动调用该格局的Cursor指标的值,也便是说,Cursor利用了该格局后就复位了。

 

(4)public
abstract boolean isClosed ()

    public
abstract boolean isFirst ()

    public
abstract boolean isLast ()

    public
abstract boolean isNull (int columnIndex)

    public
abstract boolean isClosed ()

    public
abstract boolean isAfterLast ()

    public
abstract boolean isBeforeFirst ()

在java中,类似于isWhatever格局的主意大多是对目的情况举办判定的法门——Whatever创制则赶回true,不成立则赶回false。那几个主意也不例外。

值得一提一下的是isNull方法,该办法测试某个栏位所保存的音讯是或不是为NULL。参数columnIndex代表了要命栏位的代号。

 

④别的提议各位通晓一下SimpleCursorAdapter(android.widget.SimpleCursorAdapter)本条适配器类。

 

 

 

好了,介绍这么多了,该上源码了。那些源码一点也不细略,但代表一种采用情势,所以照旧值得仔细研究的。

 

1.落到实处3个接续SQLiteOpenHelper的类

 

  1. import android.content.ContentValues;  
  2. import android.content.Context;  
  3. import android.database.Cursor;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteOpenHelper;  
  6. public class DBHelper extends SQLiteOpenHelper {  
  7.     private static final String DB_NAME = “coll.db”;  
  8.     private static final String TBL_NAME = “CollTbl”;  
  9.     private static final String CREATE_TBL = ” create table ”  
  10.             + ” CollTbl(_id integer primary key autoincrement,name text,url text, desc text) “;  
  11.       
  12.     private SQLiteDatabase db;  
  13.     DBHelper(Context c) {  
  14.         super(c, DB_NAME, null, 2);  
  15.     }  
  16.     @Override  
  17.     public void onCreate(SQLiteDatabase db) {  
  18.         this.db = db;  
  19.         db.execSQL(CREATE_TBL);  
  20.     }  
  21.     public void insert(ContentValues values) {  
  22.         SQLiteDatabase db = getWritableDatabase();  
  23.         db.insert(TBL_NAME, null, values);  
  24.         db.close();  
  25.     }  
  26.     public Cursor query() {  
  27.         SQLiteDatabase db = getWritableDatabase();  
  28.         Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);  
  29.         return c;  
  30.     }  
  31.     public void del(int id) {  
  32.         if (db == null)  
  33.             db = getWritableDatabase();  
  34.         db.delete(TBL_NAME, “_id=?”, new String[] { String.valueOf(id) });  
  35.     }  
  36.     public void close() {  
  37.         if (db != null)  
  38.             db.close();  
  39.     }  
  40.     @Override  
  41.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  42.     }  
  43. }  

 

 

2.创造贰个录入数据的类

 

  1. import android.app.Activity;  
  2. import android.content.ContentValues;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8. import android.widget.EditText;  
  9. public class AddActivity extends Activity {  
  10.     private EditText et1, et2, et3;  
  11.     private Button b1;  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.add);  
  16.         this.setTitle(“添加收藏音信”);  
  17.         et1 = (EditText) findViewById(R.id.EditTextName);  
  18.         et2 = (EditText) findViewById(R.id.EditTextUrl);  
  19.         et3 = (EditText) findViewById(R.id.EditTextDesc);  
  20.         b1 = (Button) findViewById(R.id.ButtonAdd);  
  21.         b1.setOnClickListener(new OnClickListener() {  
  22.             public void onClick(View v) {  
  23.                 String name = et1.getText().toString();  
  24.                 String url = et2.getText().toString();  
  25.                 String desc = et3.getText().toString();  
  26.                 ContentValues values = new ContentValues();  
  27.                 values.put(“name”, name);  
  28.                 values.put(“url”, url);  
  29.                 values.put(“desc”, desc);  
  30.                 DBHelper helper = new DBHelper(getApplicationContext());  
  31.                 helper.insert(values);  
  32.                 Intent intent = new Intent(AddActivity.this,  
  33.                         QueryActivity.class);  
  34.                 startActivity(intent);  
  35.             }  
  36.         });  
  37.     }  
  38. }  

 

 

3.创造3个突显数据库数据的类

 

  1. import android.app.AlertDialog;  
  2. import android.app.ListActivity;  
  3. import android.content.DialogInterface;  
  4. import android.database.Cursor;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.AdapterView;  
  8. import android.widget.ListView;  
  9. import android.widget.SimpleCursorAdapter;  
  10. import android.widget.AdapterView.OnItemClickListener;  
  11. public class QueryActivity extends ListActivity {  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         this.setTitle(“浏览收藏音信”);  
  16.         final DBHelper helpter = new DBHelper(this);  
  17.         Cursor c = helpter.query();  
  18.         String[] from = { “_id”, “name”, “url”, “desc” };  
  19.         int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };  
  20.         SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,  
  21.                 R.layout.row, c, from, to);  
  22.         ListView listView = getListView();  
  23.         listView.setAdapter(adapter);  
  24.           
  25.           
  26.         final AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  27.         listView.setOnItemClickListener(new OnItemClickListener() {  
  28.             @Override  
  29.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  30.                     long arg3) {  
  31.                 final long temp = arg3;  
  32.                 builder.setMessage(“真的要刨除该记录吗?”).setPositiveButton(“是”,  
  33.                         new DialogInterface.OnClickListener() {  
  34.                             public void onClick(DialogInterface dialog,  
  35.                                     int which) {  
  36.                                 helpter.del((int)temp);  
  37.                                 Cursor c = helpter.query();  
  38.                                 String[] from = { “_id”, “name”, “url”, “desc” };  
  39.                                 int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };  
  40.                                 SimpleCursorAdapter adapter = new SimpleCursorAdapter(getApplicationContext(),  
  41.                                         R.layout.row, c, from, to);  
  42.                                 ListView listView = getListView();  
  43.                                 listView.setAdapter(adapter);  
  44.                             }  
  45.                         }).setNegativeButton(“否”,  
  46.                         new DialogInterface.OnClickListener() {  
  47.                             public void onClick(DialogInterface dialog,  
  48.                                     int which) {  
  49.                                   
  50.                             }  
  51.                         });  
  52.                 AlertDialog ad = builder.create();  
  53.                 ad.show();  
  54.             }  
  55.         });  
  56.         helpter.close();  
  57.     }  
网站地图xml地图