【转】Android开发之数据库SQL

 android中的行使开发好麻烦幸免不错过采用数据库,这次就和大家聊聊android中的数据库操作。

 

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

 

       1.为此了呀数据库

           
android中使用的数据库是SQLite是轻量级的嵌入式开源数据库,它是为此c语言构建的。相关简介可以起链接查看。

 

       2.数据库基本知识观花

           
对于有些暨自身同一还并未真正系统学数据库技术的同室来说,把SQL92标准受到的片基本概念、基本语句快速的刺探一下,是颇有必要的,这样要会用Android的database相关方法去实施有数据库语句时即未会见茫然了。

 

       ①数据库的主导构造——表格

 

       表格是数据库中贮存资料的着力架构。表格让分为栏位 (column) 及列位
(row)。每一样排列代表同笔画资料,而各一样圈代表同样画资料的平总理份。举例来说,如果我们来一个记载顾客资料的表格,那栏位就起或连姓、名、地址、城市、国家、生日...等等。每一个表格拥有一个举世无双之名(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支持周边的数据类型,如VARCHAR、NVARCHAR、TEXT、
INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMERIC、VARYING、CHARACTER、
NATl0NAI,
VARYINGCHARACTER。这些数据类型都是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的一个不得不提的表征: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表示“且”,OR代表“或”。

 

像对表执行如下语句:

 

SELECT store_name FROM Store_Information WHERE Sales > 1000 ;

 

则显示结果也:

 

 

 

store_name 

 

Los Angeles

 

 

里面WHERE语句用的比多,因为她可兑现从定义准的下及多规格的结缘。

 

(4)INSERT INTO

 

以报表中进入资料——可以兑现同笔画的进入和多笔的进入。

 

投入一画:

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

投入多笔:

INSERT INTO “待在数据的报表” (“栏位1”, “栏位2”, …) SELECT “栏位3”,
“栏位4”, … FROM “被投入的报表” ;

 

投入多笔画其实就算是将另一个表格在到存活表格中。

 

(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**

 

除去表格中之一点数据,语法结构为:

 

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

 

满足条件的享有资料都见面受去除掉。

 

 

 

 

二、什么当android中调用数据库资源

当android中主要出半点种植办法来落实对数据库的看,一种是adb
shell方式,另一样栽是经过相关的android
的java类来间接的对数据库来开展操作。其中前者主要用以在开进程被进行调剂等工作,后者则为android中关键的运用数据库的措施。

下就是对当下简单种方式开展一个简练的介绍。

 

1.adb shell方式

 

说白了,adb shell
就是一个android模拟器的后台资源调用器(个人掌握啊~~)。它的操作方法和命令提示符差不多——以命令行的法门展开。

 

既然如此是模拟器的后台资源调用器,那当然得先开辟android模拟器了。

 

开辟模拟器后,再打开命令提示符,在里输入adb
shell
,这时会并发一个#号(懂linux的同学知道的),具体效果如下:

 

图片 1

然后您尽管可像在linux下进行shell命令的实行了。

 

接着输入 cd data/data/
并尽,再实践ls,则会显有装的软件的工包名,效果如下:

 

图片 2

 

事实上这当模拟器中是坐一个个文本夹的款型在的,所以你得为此cd命令进入她。例如我入一个晚,再就此ls命令显示其中的内容:

 

 

图片 3

欠文件夹内又存databases、
lib等公事夹(如果无databases的讲话可以友善手动用mkdir命令创建一个)。而之databases文件夹就是者动用的数据库文件之所在地,cd进入后,应该会看到其中有一个或者多只.db格式的文书(其实sqlite对文件的讳没特殊要求,你用.txt等另外的格式为堪,但推荐.db)。如果没有db文件之话语,可以据此如下命令创建:sqlite3
mydata.db。这样便见面当databases里面特别成了一个数据库文件。如果就是,可以直接用sqlite3命令调用该数据库文件,命令为
sqlite3 mydata.db(其实就是是暨刚刚之通令一个样)。接下来您不怕会盼:

 

图片 4

 

当sqlite>后面就得推行你的sql语句了。下面执行了部分简易的口舌:

 

图片 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等。遗憾的凡今天尚无法等同不善调整用该法来执行用“;”分开的多长长的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()

      创建或者打开一个但读而写的数据库。

(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供了对一个数据库查询动作返回结果束的轻易读写途径,也就是说,它是一个针对查询操作返回结果进行更加处理的好像,而这些处理就用Cursor里之方实现之。

重组SimpleCursorAdapter这个适配器类,你得挺便宜的拿数据库被之数据展示到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.落实一个后续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.创造一个示数据库数据的类

 

  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地图