天天看點

Android 更新資料庫的最佳寫法

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/u010046908/article/details/47727005

方法: 每一個資料庫版本都會對應一個版本号,當指定的資料庫版本号大于目前資料庫版本号的時候,就會進入到onUpgrade()方法中去執行更新操作。這裡需要為每一個版本号賦予它各自改變的内容,然後在onUpgrade()方法中對目前資料庫的版本号進行判斷,再執行相應的改變就可以了。

接着就讓我們來模拟一個資料庫更新的案例,還是由MyDatabaseHelper類來對資料庫進行管理。第一版的程式要求非常簡單,隻需要建立一張Book表,MyDatabaseHelper中的代碼如下所示:

“id integer primary key autoincrement, ” + “author text, ” + “price real, ” + “pages integer, ” + “name text)”;

public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version);

}

@Override

public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); }

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }

不過,幾星期之後又有了新需求,這次需要向資料庫中再添加一張Category表。于是,修改MyDatabaseHelper中的代碼,如下所示:

public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = “create table Book (” + “id integer primary key autoincrement, ” + “author text, ” + “price real, ” + “pages integer, ” + “name text)”;

public static final String CREATE_CATEGORY = “create table Category (” + “id integer primary key autoincrement, ” + “category_name text, ” + “category_code integer)”;

public MyDatabaseHelper(Context context, String name,

CursorFactory factory, int version) {

super(context, name, factory, version);

public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY);

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) {

case 1: db.execSQL(CREATE_CATEGORY);

default: }

可以看到,在onCreate()方法裡我們新增了一條建表語句,然後又在onUpgrade()方法中添加了一個switch判斷,如果使用者目前資料庫的版本号是1,就隻會建立一張Category表。這樣當使用者是直接安裝的第二版的程式時,就會将兩張表一起建立。而當使用者是使用第二版的程式覆寫安裝第一版的程式時,就會進入到更新資料庫的操作中,此時由于Book表已經存在了,是以隻需要建立一張Category表即可。

但是沒過多久,新的需求又來了,這次要給Book表和Category表之間建立關聯,需要在Book表中添加一個category_id的字段。再次修改MyDatabaseHelper中的代碼,如下所示:

public class MyDatabaseHelper extends SQLiteOpenHelper {

public static final String CREATE_BOOK = “create table Book (” + “id integer primary key autoincrement, ” + “author text, ” + “price real, ” + “pages integer, ” + “name text, ” + “category_id integer)”;

public static final String CREATE_CATEGORY = “create table Category (”

+ “id integer primary key autoincrement, ” + “category_name text, ”

+ “category_code integer)”;

public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version);

public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK);

db.execSQL(CREATE_CATEGORY);

case 1:

db.execSQL(CREATE_CATEGORY);

case 2:

db.execSQL(“alter table Book add column category_id integer”);

default: }

可以看到,首先我們在Book表的建表語句中添加了一個category_id列,這樣當使用者直接安裝第三版的程式時,這個新增的列就已經自動添加成功了。然而,如果使用者之前已經安裝了某一版本的程式,現在需要覆寫安裝,就會進入到更新資料庫的操作中。在onUpgrade()方法裡,我們添加了一個新的case,如果目前資料庫的版本号是2,就會執行alter指令來為Book表新增一個category_id列。

這裡請注意一個非常重要的細節,switch中每一個case的最後都是沒有使用break的,為什麼要這麼做呢?這是為了保證在跨版本更新的時候,每一次的資料庫修改都能被全部執行到。比如使用者目前是從第二版程式更新到第三版程式的,那麼case 2中的邏輯就會執行。而如果使用者是直接從第一版程式更新到第三版程式的,那麼case 1和case 2中的邏輯都會執行。使用這種方式來維護資料庫的更新,不管版本怎樣更新,都可以保證資料庫的表結構是最新的,而且表中的資料也完全不會丢失了。