Android数据库操作--------SQLite

来源:互联网 发布:电脑软件开发 编辑:程序博客网 时间:2024/04/30 08:18

今天我们主要学习SQLite的使用方法。对于android操作系统,他内嵌了一个非常非常小的关系型数据库,就叫SQLite

大家从名字上就能看的出来,lite 这个单词原本是清淡的意思,后来呢就广泛的用在许多软件的版本上,比如什么什么Lite版,相对来讲就是简化版,而这个SQLite的呢,是一个非常非常小的基于文本的关系型数据库,好像只有几十K大小吧,这个数据库虽然非常小,但是却提供了相对来讲比较完整的关系型数据库的特征。比如说类似于事务,主外键的关联等,这些东西呢都可以通过这个SQLite来实现。现在呢很多嵌入式的设备都在使用这个的数据库,因为相对来讲功能比较强,消耗比较小,是一个非常不错的选择,那么android操作系统也选择了这个SQLite的数据库作为他内置的关系数据库的软件。

今天就让我们来看一下如何实现在SQLite数据库上数据的存储,

 

那么照例今天来让我们看一下今天的主要学习内容

1.就是SQLite介绍

2.SQLiteOpenHelper使用方法

这是一个助手类,这是android提供的能使我们更方便的对这个SQLite数据库进行操作。

3.使用adb访问SQLite

Adbandroid提供的一个调试工具,我们通过这样一个调试工具可以在命令行中访问我们的数据库,并且编写SQL语句,对数据库进行一些查询操作。

4.增、删、改、查

最后来学习基于这个SQLite数据库如何完成增删改查的功能。因为对于数据库无非就这四条增删改查或者是这几条的结合。

http://www.sqlite.org/

这是他的SQLite网站,大家可以到这个网站上去下载这个相关的文档和信息。在文档当中,对这个SQLite有详细的介绍。我们只需要知道SQLlite是一个非常非常小的数据库,但是提供了较为完整的功能。

Android 采用了自己的一套方法来访问数据库,但是套路上来说跟JDBC基本上是一致的。在访问时必须要采用SQLiteOpenHelper这个帮助类,当然其实也不是必须要使用,只是如果不使用的话会很复杂。这个帮助类当中提供了很多方法:

getReadableDatabase()  是得到一个可读的数据库,实际上会返回一个SQLite的这样的一个对象  利用这样一个对象可以对数据库进行增删改查

getWritableDatabase()  是得到一个刻写的数据库

     A helper class to manage database creation and version management.

You create a subclass implementing onCreate(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.

   This class makes it easy for ContentProvider implementations to defer opening and upgrading the database until first use, to avoid blocking application startup with long-running database upgrades.

For an example, see the NotePadProvider class in the NotePad sample application, in the samples/ directory of the SDK.

Note: this class assumes monotonically increasing version numbers for upgrades

getReadableDatabase()

Create and/or open a database.

用来创建或者打开一个数据库 大家注意这个数据库必须是可读的数据库

返回

SQLiteDatabase

我们要想对数据库进行操作就必须得到SQLiteDatabase这个类的对象

怎么得到它呢,首先我们要得到一个SQLiteOpenHelper的对象

然后呢利用SQLiteOpenHelper类中的方法getReadableDatabase()或者说是getWritableDatabase()得到一个可写或者说可读的数据库 来得到一个SQLiteDatabase的对象

再用这个对象对数据库进行操作就可以了

下面这三个函数跟姐我们以前的经验我们一看就应该明白,三个回调函数,就是当执行某项操作的时候就会执行这些函数。

 

 

onCreate(SQLiteDatabase db)  当创建数据库的时候

onOpen(SQLiteDatabase db) 当打开数据库的时候

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)  当更新数据库的时候

那么就是说这三个函数为我们提供了一些空间,比如说,当我打开数据库的时候,我可能要创建这个数据库当中最基本的表结构,那么我创建表结构的操作就可以在这个onCreate方法里面编写,

而当我们升级数据库的时候,比如说我们要在数据库中加一些表修改一些表的字段的名称,那么我们就可以在onUpgrade这个函数中编写实现它

    那么当我们的数据库一旦升级它就会执行这个函数

现在把这个思路给大家来理一遍,也就是说当我们来操作SQLite这个数据库的时候,首先我们必须要有一个SQLiteOpenHelper的一个类的对象,但是由于这个类是个抽象类,我们需要首先写一个类来继承他,继承他之后呢,我们就拥有了这样的两个函数

getReadableDatabase()

getWritableDatabase()

当我们需要查询,增加修改删除操作时就可以调用

另外我们还可以复写那三个方法当创建数据库,当打开数据库,当更新数据库的时候

就会分别调用这三个回调函数的代码。

DatabaseHelper.javapackage mars.sqlite3.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.database.sqlite.SQLiteDatabase.CursorFactory;//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作public class DatabaseHelper extends SQLiteOpenHelper {private static final int VERSION = 1;//在SQLiteOepnHelper的子类当中,必须有该构造函数public DatabaseHelper(Context context, String name, CursorFactory factory,int version) {//必须通过super调用父类当中的构造函数super(context, name, factory, version);// TODO Auto-generated constructor stub}public DatabaseHelper(Context context,String name){this(context,name,VERSION);}public DatabaseHelper(Context context,String name,int version){this(context, name,null,version);}//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubSystem.out.println("create a Database");//execSQL函数用于执行SQL语句db.execSQL("create table user(id int,name varchar(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("update a Database");}}


下面我们来看下我们的代码

我们今天项目的名称就叫SQLlite  项目当中有两个类

一个叫做SQLiteActivity  另外一个叫做DatabaseHelper

首先我们来看一下  这个DatabaseHelper这个类继承了SQLiteOpenHelper这个类

继承了之后需要提一点是必须要有这个构造函数

 

//SQLiteOepnHelper的子类当中,必须有该构造函数

public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {

//必须通过super调用父类当中的构造函数

super(context, name, factory, version);

}

 

这个构造函数首先它是通过super来调用了父类当中的构造函数,这都是java当中最基本的语法,下面我们来看一下这个构造函数的作用是什么

super(context, name, factory, version);

这个构造函数一共有四个参数第一个是这个Context context, 类型的参数就是一个activity对象,本程序中DatabaseHelper就是一个context对象 

 

 String name 第二个参数指的是表的名字

CursorFactory factory,第三个参数今天我们不去介绍他 

int version 最后一个是我们当前数据库的版本

需要注意的是我们数据库的版本一定是个正数并且是递增的

 

为了方便我又写了两个构造函数  一个构造函数接收两个参数,一个构造函数接收三个参数

我们先来看一下这个接收三个参数的构造函数,其实这个构造函数

public DatabaseHelper(Context context,String name,int version){

this(context, name,null,version);

}

 

他是调用了上面的拥有四个参数的构造函数,只不过在CursorFactory factory,里面传了一个空值进去

这两个参数的构造函数呢调用了三个参数的构造函数

他呢只有Context和数据库的名字

而没有数据库的版本 我们给他设置了一个默认版本1  如果不想更新版本的话就调用这个函数

public DatabaseHelper(Context context,String name){this(context,name,VERSION);}//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubSystem.out.println("create a Database");//execSQL函数用于执行SQL语句db.execSQL("create table user(id int,name varchar(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("update a Database");//execSQL函数用于执行SQL语句db.execSQL("create table user(id int,name varchar(20))");}}


再往下看会发现复写的两个函数  onCreateonUpgrade 实际上我们发现我们仅仅生成这个DatabaseHelper的对象是不会调用这个onCreate方法的,只有当你调用了DatabaseHelper对象的getReadableDatabse  或者getWritableDatabase的时候才会(如果这个时候你是第一次创建这个数据库)执行这个函数。这个函数里面只有两句语句

第一句是一个打印语句

System.out.println("create a Database");

第二句是一个执行SQL的语句

db.execSQL("create table user(id int,name varchar(20))");

这条语句就是用db......我们来看一下子SQLiteDatabase db显然是,SQLiteDatabase的对象

如果大家对于回调模式理解的话就会明白这是一个回调函数

db.execSQL("create table user(id int,name varchar(20))");

这里呢是一个创建表的SQL语句

下面这个回调函数  

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// TODO Auto-generated method stub

System.out.println("update a Database");

}

我只是打印了一句话

现在这个助手类我们就写好了,现在我们要明白这个助手类他提供了两方面的功能:

第一方面:他继承了SQLiteOpenHelper 的两个方法getReadableDatabase()getWritableDatabase(),分别可以得到一个可读的数据库对象和一个可写的数据库对象,可以通过这两个函数得到一个SQLiteDatabase对象然后进行相应的操作

    第 二 方面 :提供三个回调函数使我们在创建数据库升级修改数据库时可以进行自己的操作、

下面可以运行一下这个程序 运行之后呢会出现五个依次排列的按钮,当点击createDatabase的时候就会创建一个数据库。

下面作者给出了一个操作来验证数据库是否已经创建成功,就是使用adb这样的一个工具,打开命令行(下面操作要建立在你已经设置好adb.exe的环境变量了),输入adb执行,回车就出出现adb命令的帮助信息,这个adbandroid为我们提供的一个调试工具,可以让我们进入到操作系统以linux的这种方式来调试我们的应用程序 ,我们  输入adb shell  就会进入一个linux命令行,由于我们知道这个android操作系统就是以我们linux操作系统为核心的,我们进入了linux的命令行就意味着我们可以用linux命令来操作android的这个模拟器了。

下面寻找数据库创建的位置

那么我们的数据库究竟放在linux操作系统的哪个位置呢?

我们首先使用ls -l 这个命令进入根目录下面,在根目录里面有一个data目录,我们进入到这个目录下面

cd -l

Ls

就会进入目录

其实还是使用ls -l 命令好操作一些会发现下面还是有一个data 目录的,我们再次输入cd data ,进入,然后ls -l

我们会看到在这个data目录下有大量的文件夹 这些文件夹怎么来的呢?其实每一个应用程序都是有一个文件夹的。

我们会发现有一个mars.sqlite3的文件夹就是刚才我们的额应用程序所产生的文件夹

我们又会发现名字的命名是以包名命名的

我们进入cd  mars.sqlite3

然后浏览文件  ls -l,就会发现  有两个文件  lib 和 database

我们在点击了CreateDatabase这个按钮后呢就信产生了一个数据库并且是有一个输出的

让我们来看一下监听器

class CreateListener implements OnClickListener{

@Override

public void onClick(View v) {

//创建一个DatabaseHelper对象

DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");

//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库

SQLiteDatabase db = dbHelper.getReadableDatabase();

}

}

 

 

这就是该按钮的监听类 这个监听器首先生成了一个DatabaseHelper的这样的一个对象,注意要传进去两个参数,一个是当前的额这个SQLiteActivity的这个对象,后面的这个字符串是我为我所创建的数据库所起的名字。

DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");

但是要注意,如果只是执行这行代码是不会创建数据库的,我们SQLiteDatabase db = dbHelper.getReadableDatabase(); 在执行这行代码当中才会创建数据库,其实那个database目录就是通过这个按钮多出来的。

同样的方法进入那个database文件目录发现里面有一个test_mars_db 这个目录文件,这个就是我们的数据库名字

下面我们来访问这个数据库

现在我们需要使用一个SQLite3的一个命令来打开这个数据库

具体操作如下  sqlite3 test_mars_db 回车,发现我们现在进入的界面的命令提示符变了,变成了  sqlite>,在这样的命令环境中我们就可以操纵我们的数据库了。

 

 

键入.schema就会键入浏览命令 显示当前数据库当中有哪些表 并且创建表的语句是什么样的,需要注意的是sqlite这个数据库的使用方法大体和其他数据库相同,只是在数据命令的时候要用.开头

第一个表示android自带的原始的表 

第二个表示我们创建的

public void onCreate(SQLiteDatabase db) {

// TODO Auto-generated method stub

System.out.println("create a Database");

//execSQL函数用于执行SQL语句

db.execSQL("create table user(id int,name varchar(20))");

}

就是以上代码创建的

当我们点击更新按钮时会发现 这个回调函数会被执行

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// TODO Auto-generated method stub

System.out.println("update a Database");

}

这是与相应按钮关联的监听器

 class UpdateListener implements OnClickListener{

@Override

public void onClick(View v) {

DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);

SQLiteDatabase db = dbHelper.getReadableDatabase();

}

    

}

看得出来  只一次调用的构造函数不一样了,版本号改成了参数有三个

下面看插入按钮  下面是与之关联的监听类

  class InsertListener implements OnClickListener{

@Override

public void onClick(View v) {

//生成ContentValues对象

ContentValues values = new ContentValues();

//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致

values.put("id", 1);

values.put("name","zhangsan");

DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);

SQLiteDatabase db = dbHelper.getWritableDatabase();

//调用insert方法,就可以将数据插入到数据库当中

db.insert("user"null, values);

}

}

这个类当中首先生成了一个ContentValues 的一个对象

其实这个对象在以后我们经常对数据库进行写操作的时候会经常用到

 它里面放到其实就是键值对

values.put("id", 1);

values.put("name","zhangsan");

其实就是在表中加入了一条数据  id 1  name 呢是 zhangsan

下面我们得到一个DatabaseHelper的对象 执行插入操作

因为要执行的是插入数据的操作,所以要用这条语句获得一个可写的数据库对象

SQLiteDatabase db = dbHelper.getWritableDatabase();

最后调用insert方法

 

 

 

 

db.insert("user"null, values);

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

Added in API level 1

Convenience method for inserting a row into the database.

Parameters

table

the table to insert the row into

nullColumnHack

optional; may be null. SQL doesn't allow inserting a completely empty row without naming at least one column name. If your provided values is empty, no column names are known and an empty row can't be inserted. If not set to null, the nullColumnHack parameter provides the name of nullable column name to explicitly insert a NULL into in the case where your values is empty.

values

this map contains the initial column values for the row. The keys should be the column names and the values the column values

Returns

· the row ID of the newly inserted row, or -1 if an error occurred

int android.database.sqlite.SQLiteDatabase.update(String table, ContentValues values, String whereClause, String[] whereArgs)

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

Added in API level 1

Convenience method for updating rows in the database.

Parameters

table

the table to update in

values

a map from column names to new column values. null is a valid value that will be translated to NULL.

whereClause

the optional WHERE clause to apply when updating. Passing null will update all rows.

Returns

· the number of rows affected

 

 

 

 class UpdateRecordListener implements OnClickListener{

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

//得到一个可写的SQLiteDatabase对象

DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");

SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put("name""zhangsanfeng");

//第一个参数是要更新的表名

//第二个参数是一个ContentValeus对象

//第三个参数是where子句

db.update("user", values, "id=?"new String[]{"1"});

}

}

第三个参数是where语句

 class QueryListener implements OnClickListener{

@Override

public void onClick(View v) {

System.out.println("aaa------------------");

Log.d("myDebug""myFirstDebugMsg");

DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");

SQLiteDatabase db = dbHelper.getReadableDatabase();

Cursor cursor = db.query("user"new String[]{"id","name"}, "id=?"new String[]{"1"}, nullnullnull);

while(cursor.moveToNext()){

String name = cursor.getString(cursor.getColumnIndex("name"));

System.out.println("query--->" + name);

}

}

    }

Cursor android.database.sqlite.SQLiteDatabase.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

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

Added in API level 1

Query the given table, returning a Cursor over the result set.

Parameters

table

The table name to compile the query against.

columns

A list of which columns to return. Passing null will return all columns, which is discouraged to prevent reading data from storage that isn't going to be used.

selection

A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given table.

selectionArgs

You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings.

groupBy

A filter declaring how to group rows, formatted as an SQL GROUP BY clause (excluding the GROUP BY itself). Passing null will cause the rows to not be grouped.

having

A filter declare which row groups to include in the cursor, if row grouping is being used, formatted as an SQL HAVING clause (excluding the HAVING itself). Passing null will cause all row groups to be included, and is required when row grouping is not being used.

orderBy

How to order the rows, formatted as an SQL ORDER BY clause (excluding the ORDER BY itself). Passing null will use the default sort order, which may be unordered.

Returns

· A Cursor object, which is positioned before the first entry. Note that Cursors are not synchronized, see the documentation for more details.

See Also

· Cursor

Query最后返回一个Cursor对象

相当于拥有一个按行排列的数据组

数据组上方有一个游标 一开始在最上面 然后  每一次执行moveToNext方法的时候就会发现游标就向下移动一位 有数据放回真 没数据返回假

String name = cursor.getString(cursor.getColumnIndex("name"));

括号里面返回的是列的编号。

package mars.sqlite3.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.database.sqlite.SQLiteDatabase.CursorFactory;//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作public class DatabaseHelper extends SQLiteOpenHelper {private static final int VERSION = 1;//在SQLiteOepnHelper的子类当中,必须有该构造函数public DatabaseHelper(Context context, String name, CursorFactory factory,int version) {//必须通过super调用父类当中的构造函数super(context, name, factory, version);// TODO Auto-generated constructor stub}public DatabaseHelper(Context context,String name){this(context,name,VERSION);}public DatabaseHelper(Context context,String name,int version){this(context, name,null,version);}//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubSystem.out.println("create a Database");//execSQL函数用于执行SQL语句db.execSQL("create table user(id int,name varchar(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("update a Database");}}


 

package mars.sqlite3;import mars.sqlite3.db.DatabaseHelper;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class SQLiteActivity extends Activity {    /** Called when the activity is first created. */private Button createButton;private Button insertButton;private Button updateButton;private Button updateRecordButton;private Button queryButton;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        createButton = (Button)findViewById(R.id.createDatabase);        updateButton = (Button)findViewById(R.id.updateDatabase);        insertButton = (Button)findViewById(R.id.insert);        updateRecordButton = (Button)findViewById(R.id.update);        queryButton = (Button)findViewById(R.id.query);                createButton.setOnClickListener(new CreateListener());        updateButton.setOnClickListener(new UpdateListener());        insertButton.setOnClickListener(new InsertListener());        updateRecordButton.setOnClickListener(new UpdateRecordListener());        queryButton.setOnClickListener(new QueryListener());    }    class CreateListener implements OnClickListener{@Overridepublic void onClick(View v) {//创建一个DatabaseHelper对象DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库SQLiteDatabase db = dbHelper.getReadableDatabase();}    }    class UpdateListener implements OnClickListener{@Overridepublic void onClick(View v) {DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);SQLiteDatabase db = dbHelper.getReadableDatabase();}        }    class InsertListener implements OnClickListener{@Overridepublic void onClick(View v) {//生成ContentValues对象ContentValues values = new ContentValues();//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致values.put("id", 1);values.put("name","zhangsan");DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);SQLiteDatabase db = dbHelper.getWritableDatabase();//调用insert方法,就可以将数据插入到数据库当中db.insert("user", null, values);}    }    //更新操作就相当于执行SQL语句当中的update语句    //UPDATE table_name SET XXCOL=XXX WHERE XXCOL=XX...    class UpdateRecordListener implements OnClickListener{@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//得到一个可写的SQLiteDatabase对象DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", "zhangsanfeng");//第一个参数是要更新的表名//第二个参数是一个ContentValeus对象//第三个参数是where子句db.update("user", values, "id=?", new String[]{"1"});}    }    class QueryListener implements OnClickListener{@Overridepublic void onClick(View v) {System.out.println("aaa------------------");Log.d("myDebug", "myFirstDebugMsg");DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);while(cursor.moveToNext()){String name = cursor.getString(cursor.getColumnIndex("name"));System.out.println("query--->" + name);}}    }    }


 

原创粉丝点击