db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
上面几种都是常用的查询方法,第一种最为简单,将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数,selectionArgs就是占位符实际参数集;下面的几种参数都很类似,columns表示要查询的列所有名称集,selection表示WHERE之后的条件语句,可以使用占位符,groupBy指定分组的列名,having指定分组条件,配合groupBy使用,orderBy指定排序的列名,limit指定分页参数,distinct可以指定“true”或“false”表示要不要过滤重复值。需要注意的是,selection、groupBy、having、orderBy、limit这几个参数中不包括“WHERE”、“GROUP BY”、“HAVING”、“ORDER BY”、“LIMIT”等SQL关键字。 最后,他们同时返回一个Cursor对象,代表数据集的游标,有点类似于JavaSE中的ResultSet。
下面是Cursor对象的常用方法:
[java]view plaincopyprint?
1. c.move(int offset); //以当前位置为参考,移动到指定行 2. c.moveToFirst(); //移动到第一行 3. c.moveToLast(); //移动到最后一行
4. c.moveToPosition(int position); //移动到指定行 5. c.moveToPrevious(); //移动到前一行 6. c.moveToNext(); //移动到下一行 7. c.isFirst(); //是否指向第一条 8. c.isLast(); //是否指向最后一条 9. c.isBeforeFirst(); //是否指向第一条之前 10. c.isAfterLast(); //是否指向最后一条之后
11. c.isNull(int columnIndex); //指定列是否为空(列基数为0) 12. c.isClosed(); //游标是否已关闭 13. c.getCount(); //总数据项数
14. c.getPosition(); //返回当前游标所指向的行数
15. c.getColumnIndex(String columnName);//返回某列名对应的列索引值 16. c.getString(int columnIndex); //返回当前行指定列的值
c.move(int offset); c.moveToFirst(); c.moveToLast();
//以当前位置为参考,移动到指定行 //移动到第一行 //移动到最后一行
//移动到指定行
c.moveToPosition(int position);
c.moveToPrevious(); c.moveToNext(); c.isFirst(); c.isLast();
//移动到前一行 //移动到下一行 //是否指向第一条 //是否指向最后一条 //是否指向第一条之前 //是否指向最后一条之后
//指定列是否为空(列基数为0)
//游标是否已关闭 //总数据项数
//返回当前游标所指向的行数
c.isBeforeFirst(); c.isAfterLast(); c.isClosed(); c.getCount(); c.getPosition();
c.isNull(int columnIndex);
c.getColumnIndex(String columnName);//返回某列名对应的列索引值 c.getString(int columnIndex); //返回当前行指定列的值
在上面的代码示例中,已经用到了这几个常用方法中的一些,关于更多的信息,大家可以参考官方文档中的说明。
最后当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。
上面就是SQLite的基本应用,但在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。
下面,我们就以一个实例来讲解具体的用法,我们新建一个名为db的项目,结构如下:
其中DBHelper继承了SQLiteOpenHelper,作为维护和管理数据库的基类,DBManager是建立在DBHelper之上,封装了常用的业务方法,Person是我们的person表对应的JavaBean,MainActivity就是我们显示的界面。 下面我们先来看一下DBHelper:
[java]view plaincopyprint?
1. package com.scott.db; 2.
3. import android.content.Context;
4. import android.database.sqlite.SQLiteDatabase; 5. import android.database.sqlite.SQLiteOpenHelper; 6.
7. public class DBHelper extends SQLiteOpenHelper { 8.
9. private static final String DATABASE_NAME = \10. private static final int DATABASE_VERSION = 1; 11.
12. public DBHelper(Context context) { 13. //CursorFactory设置为null,使用默认值
14. super(context, DATABASE_NAME, null, DATABASE_VERSION); 15. } 16.
17. //数据库第一次被创建时onCreate会被调用 18. @Override
19. public void onCreate(SQLiteDatabase db) {
20. db.execSQL(\
21. \
age INTEGER, info TEXT)\22. } 23.
24. //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用
onUpgrade 25. @Override
26. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVe
rsion) {
27. db.execSQL(\28. } 29. }
package com.scott.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper { }
正如上面所述,数据库第一次创建时onCreate方法会被调用,我们可以执行创建表的语句,当系统发现版本变化之后,会调用onUpgrade方法,我们可以执行修改表结构等语句。 为了方便我们面向对象的使用数据,我们建一个Person类,对应person表中的字段,如下:
[java]view plaincopyprint?
private static final String DATABASE_NAME = \private static final int DATABASE_VERSION = 1;
public DBHelper(Context context) { }
//数据库第一次被创建时onCreate会被调用 @Override
public void onCreate(SQLiteDatabase db) { }
//如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int }
db.execSQL(\db.execSQL(\
\INTEGER PRIMARY KEY AUTOINCREMENT,
//CursorFactory设置为null,使用默认值
super(context, DATABASE_NAME, null, DATABASE_VERSION);
name VARCHAR, age INTEGER, info TEXT)\
即会调用onUpgrade
newVersion) { STRING\
1. package com.scott.db; 2.
3. public class Person { 4. public int _id; 5. public String name; 6. public int age; 7. public String info; 8.
9. public Person() { 10. } 11.
12. public Person(String name, int age, String info) { 13. this.name = name; 14. this.age = age; 15. this.info = info; 16. } 17. }
package com.scott.db;
public class Person { }
然后,我们需要一个DBManager,来封装我们所有的业务方法,代码如下:
public int _id; public String name; public int age; public String info;
public Person() { }
public Person(String name, int age, String info) { }
this.name = name; this.age = age; this.info = info;