Android 数据存储和IO(2)

接着上篇博文,这一篇主要说的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来存储数据:生词本

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ppjjd.html