SQLiteOpenHelper

Android提供操作SQLite的能力,但實際操作的是一個SQLiteDataBase物件,而SQLiteOpenHelper類別的任務是負責管理資料庫檔案的建立與版本控制。

SQLiteOpenHelper(context, database name, factory, database version)

SQLiteOpenHelper負責建立一個Helper物件來建立、開啟與管理一個SQLiteDatabase。在實作Helper類別時,name通常使用的是一個資料庫檔案(StudentList.db),也是一個組合過的路徑(/data/data/SQLite/StudentList.db)

onCreate(SQLiteDatabase db)

資料庫建立時所啟動執行的方法,代表會重新建立一個新的資料庫,通常在此階段把資料庫基本的SchemaTable或相關設定一併處理完畢。此方法在執行時,如遇到DB已存在,則進入onOpen()方法;如不存在則會先建立一個DataBase

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

此方法發生在當資料庫版本不一致時就會觸發。主要任務為因為在知道資料庫版本不同時,要進行資料的覆蓋或重建都必需要好好考量,因為有可能讓資料遺失或不一致。

onOpen(SQLiteDatabase db)

當資料庫被開啟時則進入此Method,配合SQLiteOpenHelper提供的二個方法相呼應:getReadableDatabase()getWritableDatabase()分別取得唯讀(Read-only)與可編輯(Write)的資料庫實體。然而,這二個方法即時觸發onCreateonUpgradeonOpen的來源者,所以上述介紹的幾個重要的方法,則真正被呼叫時是在getWritableDatabase()或是getReadableDatabase()被使用時。

SQLiteDataBase

Android程式實際操作的真正實體(database),提供所有操作SQLite的功能,包括:新增、修改、刪除、查詢等,協助操作裡面的資料,SQLiteDataBase提供一些已經包裝好的方法,當然也包括了指定SQL指令來操作資料的內容,除此之外,也支援Transcation的使用。beginTransaction()setTransactionSuccessful()endTransaction() 

execSQL(String sql)

專門執行單一非SelectSQL指令或是其他操作資料庫的指令,例如:建立資料表的指令、或是操作權限等相關的管理類的指令。

rawQuery(String sql, String[] selectionArgs)

如果今天針對要操作的資料,不單單只有一個Table而已時,即可以透過這個方法就像過去操作.NETSQLCommand物件方式,把SQL指令先撰寫好,交由SQLiteDatabase來操作資料。回傳值為:Cursor(其中也可以使用SQLiteCursor,它是Cursor的實作類別)

query/insert(String table, String nullColumnHack, ContentValues values)/update/delete

這是包裝好針對一個Table進行基本的新增、修改、刪除與查詢的固定方法,其使方法非常容易,透過指定的Table與相關的參數,包括:select的欄位、where的參數(使用[?] 做為參數取代值)Sort等,讓開發人員可以快速取得資料,但如果需要比較複雜的查詢,就建議使用上述的rawQuery()來執行。它一樣回傳一個Cursor物件。至於新增、修改與刪除的部分呢,將配合下方的物件來使用。

ContentValues/Cursor

在新增、修改、刪除的方法使用時,如果是使用上述已包裝好的方法,例如:insert(String table, String nullColumnHack, ContentValues values),則一定要了解ContentValuesContenResolver的使用方法。並且,這三個方法的使用,都會回傳成功影響的比數,如失敗則為:-1

ContentValues

專門用於欲操作的資料內容。透過put的方式操作內容值,這與過去直接操作data tabledata row是比較不同的。不過它相似於key/value的操作方式,因此,當在使用put(String key, object value)時,key則需要對應到tablecolumn name才行。

Cursor

則是操作查詢出來的結果,提供了相當豐富的方法與屬性,協助開發人員擷取資料的內容與移動索引值。

SQLiteCursor

它是實作Cursor的一個類別,主要承接從SQLiteDatabase查詢出來的資料,它被擷取出來之後,則與資料庫內的資料採不同步的方式,這也就是說,當query出來的結果被放入SQLiteCursor之後,它就像是一個Cache,後來如果其他程式段改了DB中的資料,則SQLiteCursor並不會被更新,需要重新查詢(requery())才有辦法取得。然而,SQLiteCursor類別提供很多便利的方法,包括:getCount()取得欄位數、getDatabase()取得來源資料庫等方法,操作起來如同使用.NET中的TableRowTableColumn的使用概念。

SQLiteStatement

該類別提供一個事先編譯(pre-compiled)SQL指令,讓該SQL指令可以重覆針對SQLiteDatabase使用時,不需要每次都重新編譯,常見的例子:連續性新增資料。但要特別注意的:"它無法回傳多筆資料(rows),只能11的資料集合被回傳"。另外,在使用它時,不需要new,只需直接使用compileStatement(String)語法即可。它也是非同步的物件,要同步都需要自己實作。

SQLiteQueryBuilder

如果透過String.format來組合SQL指令覺得不方便的話,可以使用SQLiteQueryBuiler類別來進行查詢指定的建立。它提供透過設定屬性與方法的方式,組合要查詢的相關SQL指令(buildQuery)。也有提供豐富的, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String)" target=_blank>, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String)" target=_blank>, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String)" target=_blank>buildUnionSubQuery等方法,

References:

Android - 認識SQLite與資料移動至SD Card

 


arrow
arrow
    文章標籤
    SQLite Method
    全站熱搜

    S 發表在 痞客邦 留言(2) 人氣()