Android Studio中通過SQLiteOpenHelper操作資料庫
在《Android Studio中通過SQLiteDatabase操作資料庫》一文中提到了使用SQLiteDatabase類操作資料庫的方法。使用該類操作資料庫,在建立資料庫和更新資料庫時,需要考慮到多種情況,例如需要考慮當前資料庫是否存在,當前資料庫是否已經開啟,當前資料庫是否有寫操作許可權等。通過程式設計實現以上情況的判斷是非常繁瑣的。使用SQLiteOpenHelper類來建立和更新資料庫時,這些情況的判斷都包含在該類的程式碼中,呼叫者無需再考慮,簡化了操作資料庫的流程。
1 SQLiteOpenHelper類簡介
SQLiteOpenHelper是SQLiteDatabse的一個幫助類,用來管理資料的建立和版本更新。該類是一個抽象類,要使用SQLiteOpenHelper類時必須建立該類的派生類。
2 建立SQLiteOpenHelper類的派生類
在Android Studio中新增一個新類,將該類的名稱設定為“DBHelper”,該類派生自SQLiteOpenHelper,如圖1所示。
圖1 新建SQLiteOpenHelper類的子類
2.1 構造方法
SQLiteOpenHelper類的構造方法格式為
public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
其中,引數context表示用來開啟或建立資料據的上下文;name指定了資料庫檔案;factory用來建立cursor物件,如果使用預設的factory,則將該引數設定為null;version表示資料庫的版本號,該版本號從1開始依次遞增。
public static final String DATABASE_NAME = "gcontacts.db"; public static final int DATABASE_VERSION = 2; public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }
在自定義的DBHelper類的構造方法中,呼叫了父類的構造方法。需要注意的時,此時只是指定資料庫檔名和資料庫的版本號,並沒有真正的建立資料庫檔案。在呼叫SQLiteOpenHelper類的getWritableDatabase()或者getReadableDatabase()時才會建立或開啟資料庫檔案。
2.2 onCreate()方法
在派生的自類中需要重寫onCreate()方法。當資料庫檔案被首次建立時會呼叫該函式,也就是在呼叫呼叫SQLiteOpenHelper類的getWritableDatabase()或者getReadableDatabase()時會呼叫該方法。在該方法中主要完成資料庫表的建立和記錄的新增。
private static final String DATABASE_CREATE = "CREATE TABLE contacts (_id integer primary key autoincrement,username text,password text)";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
2.3 onUpgrade()方法的編寫
當資料庫需要更新的時候呼叫該方法。可以通過該方法實現刪除表、新增表或者更新表。該方法的格式為
public abstract void onUpgrade(SQLiteDatabase db,
int oldVersion,
int newVersion)
其中,引數db表示資料庫;oldVersion表示舊版本號;newVersion表示新版本號。例如在舊版本中,user表包含username域和password域;如果在新版本的user表中又添加了access域,此時無需手動將舊的資料庫檔案刪除然後再建立新的資料庫檔案。只需要呼叫onUpgrade()方法即可。通過指定在“2.1 構造方法”中提到的構造方法的第四個引數的值來呼叫onUpgrade()方法。例如在舊版本中,使用DBHelper類時,將構造方法的第四個引數設定為1,在新版本中,將該引數改為2即可。此時,onUpgrade()方法會被呼叫,在該方法中,呼叫onCreate()方法重新為user表新增access域。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE);
onCreate(db);
}
以上程式碼的作用是,首先判斷指定的表是否存在,如果存在,則刪除該表;之後呼叫onCreate()方法重新建立該表,達到更新表的目的。
3 使用SQLiteOpenHelper類的派生類
在“2.1 構造方法”中提到,只有呼叫了SQLiteOpenHelper類的getWritableDatabase()或者getReadableDatabase()後才能建立資料庫。
3.1 建立資料庫
SQLiteDatabase contactsDB;
dbHelper = new DBHelper(getContext());
contactsDB = dbHelper.getWritableDatabase();
其中,contactsDB即為建立或開啟的資料庫。
3.2 操作資料庫
在建立或者打開了資料庫之後,對資料庫的新增、刪除、查詢、更新等操作,都可以通過在“3.1 建立資料庫”中獲取到的資料庫物件contactsDB來實現。實現的方法詳見《Android Studio中通過SQLiteDatabase操作資料庫》。