天天看點

Sqlite資料庫相關操作

1  資料庫思路

(1)可把表中的字段用javabean來實作

(2)在資料庫和ContentProvider結合使用時,不采用此處SQLiteDatabase的execSQL()和rawQuery()方法來實作資料的增删改查而是使用了SQLiteDatabase的自帶的update(),delete(),query()等方法.因為兩者的參數基本一緻,直接從ContentProvider傳遞給這些自帶方法即可

2  SQLiteOpenHelper的引入

我們在編寫資料庫應用軟體時,需要考慮這樣的問題:因為軟體可能會安裝在很多使用者的手機上.

如果應用使用到了SQLite資料庫,我們必須在使用者初次使用軟體時建立出應用使用到的資料庫表結構及添加一些初始化記錄,另外在軟體更新的時候,也需要對資料表結構進行更新。

那麼,我們如何才能實作在使用者初次使用或更新軟體時自動在使用者的手機上建立出應用需要的資料庫表呢?總不能讓我們在每個需要安裝此軟體的手機上通過手工方式建立資料庫表吧?(這也是為什麼它叫……OpenHelper的原因)

于是可以複寫SQLiteOpenHelper的onCreate()和onUpgrade()方法以在建立資料庫和資料庫版本發生變化時自動調用。

3  DataBaseOpenHelper 的使用

DataBaseOpenHelper的執行個體dataBaseOpenHelper可以dataBaseOpenHelper.getWritableDatabase()和dataBaseOpenHelper.getWritableDatabase()的方式傳回資料庫SQLiteDatabase的執行個體db。這兩種方式有什麼差別呢?檢視源代碼可知:getReadableDatabase在不出錯的時候其實際傳回的是getWritableDatabase.那麼什麼時候會出錯呢?

資料庫的磁盤空間滿了,資料庫此時隻可以讀而不可以寫,是以不可以用讀寫(可以進行讀和寫操作)方式打開資料庫。這個時候就會報錯;是以隻可以用隻讀方式打開資料庫。

是以在出錯的時候,傳回的是getReadableDatabase()!!!

4  資料庫的增删改查操作

利用SQLiteDatabase的執行個體db進行資料庫的增删改查操作.其中db.execSQL()來執行更改行為的語句;db.rawQuery()來執行查詢語句

注意:

(1)在SQL語句中最好使用占位符,這樣來提高SQL語句的安全性

(2)public void execSQL (String sql, Object[] bindArgs)第二個參數是Object數組

(3)public Cursor rawQuery (String sql, String[] selectionArgs)第二個參數是String數組

增加示例:

db.execSQL("insert into person (name,phone) values(?,?)",new Object[]{person.getName(),person.getPhone()});

更新示例:

public void update(Person person){

   SQLiteDatabase db=openHelper.getWritableDatabase();

   db.execSQL("update person set name=?,phone=? where personid=?",new Object[]{person.getName(),person.getPhone(),person.getId()});

 }

删除示例:

public void delete(int i){

        SQLiteDatabase db=openHelper.getWritableDatabase();

          db.execSQL("delete from person where personid=?",new Object[]{String.valueOf(i)});

 } 

查找示例:

注意:

(1)db.rawQuery()的結果是一個cursor結果集.其指針最開始時候執行指向結果集的上方,即第一條紀錄的前面

(2)取值操作:cursor.get具體類型(參數為某列的名稱的索引值)

(3)最後關閉cursor

統計示例:

分頁示例: 

5 資料庫事務

結束事務有兩種:送出事務和復原事務。預設情況是復原事務!!!

事務是否送出是由事務的标志來決定的,如果事務的标志位失敗(false),那麼就復原事務,否則(true)送出事務。

是以預設情況下事務的标志為失敗(false),事務復原.

為什麼要把結束事務放在finally裡面?

若不這樣當事務發生異常,便不會往下執行了,資料庫要等到一個逾時後才會結束事務而影響性能,是以在finally裡将其結束