接着上篇博文,這一篇主要說的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來存儲數據:生詞本