把重復的或結構化的數據(如通信錄信息)保存到數據庫中是很好的想法。本節課假設你熟悉通常的SQL數據庫,並幫助你在Android平台上開始使用SQLite數據庫。在Android平台上,你需要使用的數據庫API包含在android.database.sqlite包中。
定義模式和約束
SQL數據的一個主要原則是模式:數據庫是如何組織的一個正式聲明。模式被反映在你用於創建數據庫的SQL語句中。你可能會發現,它有助於創建伴侶類,即約束(contract)類,這個類使用系統性的和自記錄的方式來明確的指定你的模式的布局。
約束(contract)類是一個定義URIs、表名和列名的常量容器。在相同包中的所有類都可以使用這個約束類中的常量。這樣就會一處修改,全局有效。
組織約束類的一個好方法是把定義放到類的根層次,以便它對整個數據庫有效。
注意:通過實現BaseColumns接口,你的內部類會繼承一個叫做_ID的主鍵,某些Android類(如游標適配器)會希望有這個字段。它不是必須的,但是,這個字段會幫助你的數據庫跟Android框架更和諧的工作。
例如,以下代碼片段定義一個表的表名和列名:
publicstaticabstractclassFeedEntryimplementsBaseColumns{
public static final String TABLE_NAME = "entry";
public static final String COLUMN_NAME_ENTRY_ID = "entryid";
public static final String COLUMN_NAME_TITLE = "title";
public static final String COLUMN_NAME_SUBTITLE = "subtitle";
...
}
為了防止約束類被意外的實例化,它的構造器是私有的:
// Prevents the FeedReaderContract class from being instantiated.
private FeedReaderContract() {}
使用SQL輔助器來創建數據庫
一旦你定義了你的數據庫,你就應該實現創建和維護數據庫以及表的方法。以下是創建和刪除表的典型語句:
privatestaticfinalString TEXT_TYPE =" TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + FeedReaderContract.FeedEntry.TABLE_NAME + " (" +
FeedReaderContract.FeedEntry._ID + " INTEGER PRIMARY KEY," +
FeedReaderContract.FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
... // Any other options for the CREATE command
" )";
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + TABLE_NAME_ENTRIES;
就像你在設備的內部存儲器上保存文件那樣,Android會在跟應用程序關聯的私有的硬盤空間中保存你的數據庫。因為默認情況下,這塊區域對其他應用程序來說是不可訪問的,所以你的數據是安全的。
使用SQLiteOpenHelper類中的一組API是有益的。因為當因使用這個類來獲取數據庫的引用時,系統只會在需要時和應用程序的非啟動期間來執行潛在的創建和更新數據庫的長時操作。你需要做所有工作就是調用getWritableDatabase()或getReadableDatabase()方法。
注意:因為它們是長時操作,所以必須確保在後台的線程中調用getWritableDatabase()和getReadableDatabase()方法,如在AsyncTask或IntentService中調用。
要使用SQLiteOpenHelper,就要繼承SQLiteOpenHelper類來創建一個子類,並重寫onCreate()、onUpgrade()和onOpen()回調方法,還可以選擇性的實現onDowngrade()回調方法。
例如,以下是SQLiteOpenHelper類的一個子類實現:
publicclassFeedReaderDbHelperextendsSQLiteOpenHelper{
// If you change the database schema, you must increment the database version.
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "FeedReader.db";
public FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}
使用以下方法來訪問你的數據庫:
FeedReaderDbHelper mDbHelper =newFeedReaderDbHelper(getContext());