Activites 可以通过 Content Provider 或者 Service 访问一个数据库。
Android平台下数据库相关类:
SQLiteOpenHelper 抽象类:通过从此类继承实现用户类,来提供数据库打开、关闭等操作函数。
SQLiteDatabase 数据库访问类:执行对数据库的插入记录、查询记录等操作。
SQLiteCursor 查询结构操作类:用来访问查询结果中的记录。
创建数据库
Android不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。
Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。
SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:
1 | package com.dandan.fm.db; |
3 | import android.content.Context; |
4 | import android.database.sqlite.SQLiteDatabase; |
5 | import android.database.sqlite.SQLiteDatabase.CursorFactory; |
6 | import android.database.sqlite.SQLiteOpenHelper; |
9 | * 可以通过SQLiteOpenHelper的以下两个方法来或得SQLiteDatabase的对象: |
10 | * getReadableDatabase() 创建或者打开一个查询数据库 |
11 | * getWritableDatabase() 创建或者打开一个可写数据库 |
13 | public class DBHelper extends SQLiteOpenHelper { |
17 | * @param context 上下文路径 |
19 | * @param factory 可选游标工厂,通常为NULL |
20 | * @param version 当前数据库版本号 |
22 | public DBHelper(Context context, String name, CursorFactory factory, |
24 | super (context, name, factory, version); |
29 | public void onCreate(SQLiteDatabase db) { |
31 | db.execSQL( "create table user(id INTEGER PRIMARY KEY AUTOINCREMENT," + |
32 | "name varchar(20), address TEXT)" ); |
37 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} |
41 | public void onOpen(SQLiteDatabase db) { |
46 | public synchronized void close() { |
创建表和索引
上面这行代码
1 | db.execSQL( "create table user(id INTEGER PRIMARY KEY AUTOINCREMENT," + |
2 | "name varchar(20), address TEXT)" ); |
创建了一个名为user的表,有一个列名id,为主键,并且这列的值是自动增长的整数(当你插入一行时,SQLite会自动给这列赋值)。
SQLite会自动为主键列添加索引。
给表添加数据
有两种方式添加数据:
1.向上面创建表一样,可以使用execSQL方法执行 INSERT, UPDATE, DELETE 等语句来更新表的数据。
execSQL适用于所有不需要返回结果的SQL语句。如:
1 | db.execSQL( "INSERT INTO user (name, address) VALUES ('YuanFang'," + |
2 | "'http://www.20864.com')" ); |
2.SQLiteDatabase 对象的 insert(), update(), delete() 方法。这些方法把 SQL 语句的一部分作为参数。如:
1 | private SQLiteDatabase mDataBase = null ; |
2 | private static final String USER_TABLE = "user" ; |
6 | DBHelper db = new DBHelper( this , USER_TABLE, null , 1 ); |
8 | mDataBase = db.getWritableDatabase(); |
11 | public void insert() { |
13 | ContentValues cv = new ContentValues(); |
14 | cv.put( "name" , "LiuMing" ); |
15 | cv.put( "address" , "ShangHai" ); |
16 | mDataBase.insert(USER_TABLE, null , cv); |
20 | ContentValues cv = new ContentValues(); |
21 | cv.put( "name" , "MaLi" ); |
24 | return mDataBase.update(USER_TABLE, cv, "id = ?" , new String[]{ "1" }); |
29 | return mDataBase.delete(USER_TABLE, "id = ? and name = ?" , |
30 | new String[]{ "1" , "MaLi" }); |
查询数据库
与INSERT,UPDATE,DELETE类似,有两种方法从数据库中查询数据。
2 | * 使用rawQuery()直接调用SELECT语句,最简单的查询方法 |
3 | * 如果查询是动态的,使用rawQuery就会非常复杂 |
4 | * @return Cursor可以迭代查询结果 |
6 | public Cursor rawQuery() { |
7 | return mDataBase.rawQuery( "select * from user where id = ? and name = ?" , |
8 | new String[]{ "1" , "LiuMing" }); |
12 | public Cursor query() { |
13 | String[] columns = { "name" , "address" }; |
20 | return mDataBase.query(USER_TABLE, columns, "id = ?" , new String[] { "1" }, |
使用游标
不管如何执行查询,都会返回一个Cursor,Curosr主要方法如下:
getCount():获得结果集中有多少记录。
moveToFirst():移动到第一行。
moveToNext():移动到下一行,可遍历所有记录。
isAfterLast():判断是否最后一行。
getColumnNames():返回字段名。
getColumnCount():返回字段号。
getString(),getInt():得到给定字段当前记录的值。
requery():重新执行查询得到游标。
close():释放游标资源。
1 | public void getValue() { |
3 | Cursor c = mDataBase.rawQuery( "select id, name from user" , null ); |
5 | while (!c.isAfterLast()) { |
7 | String name = c.getString( 1 ); |
14 | if (c.getCount() > 0 ) { |
18 | int id = c.getInt(c.getColumnIndex( "id" )); |
19 | String name = c.getString(c.getColumnIndex( "name" )); |
20 | } while (c.moveToNext()); |