接着上篇博文,这一篇主要说的SQLite。
二:SQLite数据库
1. Android的SQLite数据库只是一个文件,我们可以把它看做是一个更为便捷的文件操作。Android提供了SQLiteDatabase代表一个数据库,一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来就可通过SQLiteDatabase对象来管理、操作数据库了。
SQLiteDatabase提供的静态的方法来打开一个文件对应的数据库:
a. static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags):打开path文件所代表的SQLite数据库。
b. static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactory factory):打开或创建(如果不存在)file文件所代表的SQLite数据库。
c. static SQLiteDatabase openOrCreateDababase(String path,SQLiteDabase.CursorFactory factory):打开或创建(如果不存在)path文件所代表的SQLiteDatabase数据库。
在获取到SQLiteDatabase对象后,接下来就可调用SQLiteDatabase的如下方法来操作数据库了。
a. execSQL(String sql,Object[] bindArgs):执行带占位符的SQL语句。
b. execSQL(String sql):执行SQL语句。
c. insert(String table,String nullColumnHack,ContentValues values):向执行表中插入数据。
d. update(String table,ContentValues,values,String whereClaues,String[] whereArgs):更新指定表中的特定数据。
e. delete(String table,String whereClaues,String[] whereArgs):删除指定表中的特定的数据。
f. Cursor query(String table,String[] columns,String selection,String [] selectionArgs,String groupBy,String having,String orderBy):对执行数据表执行查询。
g. Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit):对执行数据表执行查询。limit参数控制最多查询几条记录(控制分页的参数)
h. Cursor query(boolean distinct,String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit):对指定表执行
查询语句。其中第一个参数控制是否去除重复值。
i. rawQuery(String sql,String[] seletionArgs):执行带占位符的SQL查询。
j. beginTransaction():开始事务。
k. endTransaction():结束事务。
上面的查询方法都返回一个Cursor对象。Cursor提供了如下的方法来移动查询结果的记录指针。
a. move(int offset):将记录指针向上或向下移动指定的行数。offset为正数就是向下移动;为负数就是向上移动。
b. boolean moveToFirst():将记录指针移动到第一行,如果移动成功则返回true.
c. boolean moveToLast():将记录指针移动到最后一行,如果移动成功则返回true.
d. boolean movwToNext():将记录指针移动到下一行,如果移动成功则返回true.
e. boolean movePosition(int position):将记录指针移动到指定的行,如果移动成功则返回true.
f. boolean moveToPrevious():将记录指针移动到上一行,如果移动成功则返回true,
一旦将记录指针移动到指定的行后,接下来就可以调用Cursor的getXxx()方法来获取该行的指定列的数据。
SQLiteDatabase的execSQL方法可执行任意的SQL语句,包括带占位符的SQL语句。但由于该方法没有返回值,一般用于执行DDL语句或DML语句;如果需要执行查询语句,则可调用SQLiteDatabase的rawQuery(String sql,String[] selectionArgs)方法。
一般可以将查询的结果Cursor封装成SimpleCursorAdapter,这个SimpleCursorAdapter实现了Adapter接口,因此可以作为ListView或GridView的内容适配器。
SimpeCursoeAdapter的构造器参数与SimpleAdapter的构造器参数大致相同,区别是SimpleAdapter负责封装集合元素为Map的List,而SimpleCursorAdapter负责封装Cursor:如果我们把Cursor里的结果集当成List集合,Cursor里的每一行当成Map处理(以数据列的列名为key,数据列的值为value),那么SimpleCursorAdapter与SimpleAdapter就统一起来了。
另外一点是:使用SimpleCursorAdapter封装了Cursor时要求底层数据表的主键列的列名为_id,因为SimpleCursorAdapter只能识别列名为_id的主键。因此创建数据库表时要指定主键的列名为_id.
总结起来使用SQLiteDatabase进行数据库操作的步骤如下:
a. 获取SQLiteDatabase对象,它代表了与数据库的连接。
b. 调用SQLiteDatabase的方法来执行SQL语句。
c. 操作SQL语句的执行结果,比如用SimpleCursorAdapter封装Cursor。
d. 关闭SQLiteDatabase,回收资源。
2. 使用特定的方法操作SQLite数据库
Android提供了insert,update,delete,query语句来操作数据库。
a. 使用insert方法插入记录:
SQLiteDatabase的insert方法的签名为long insert(String table,String nullColumnHack,ContentValues values),参数说明:
table:代表想插入数据的表名。
nullColumnHack:代表强行插入null值的数据列的列名。
values:代表一行记录的数据。
insert方法插入的一行记录使用ContentValues存放,ContentVlaues类似于Map,它提供了put(String key,Xxx value)方法用于存入数据、getAsXxx(String key)方法用于取出数据。
不管第三个参数是否包含数据,执行insert()方法总会添加一条记录。
b. 使用update方法更新记录
c. 使用delete方法删除数据
d. 使用query()方法查询记录
三、SQLiteOpenHelper类
SQliteOpenHelper是Android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本的更新。一般的用法是创建SQLiteOpenHelper的子类,并扩展它的onCreate(SQLiteDatabse db)和onUpgrade(SQLiteDatabse db,int oldVerson,int newVerson)方法。
SQLiteOpenHelper包含的常用的方法:
a. synchronized SQLiteDatabase getReadableDatabse():以读写的方式打开数据库对应的SQLiteDatabase对象。
b. synchronized SQLiteDatabase gerWritableDatabase():以写的方式打开数据库对应的SQLiteDatabase对象。
c. abstract void onCreate(SQLiteDatabase db):当第一次创建数据库时回调该方法
d. abstract void onUpgrade (SQLiteDatabase db,int oldVersion,int newVersion):当数据库版本更新时回调该方法。
e. synchronized void close():关闭所有打开的SQLiteDatabase
因为SQLiteOpenHelper提供了getReadableDatabase()、getWriteDatabase()两个方法用于打开数据库连接,并提供了close方法 来关闭数据库连接,我们只要重写它的恋歌抽象方法就可以:onCreate()和onUpgrade()
接下来,用一个实例来实现用SQLite来存储数据:生词本