若是你足夠細心,必定會發現 MyDatabaseHelper 中還有一個空方法呢!沒錯,onUpgrade() 方法是用於對數據庫進行升級的,它在整個數據庫的管理工做當中起着很是重要的做用,可 千萬不能忽視它喲。shell
目前 DatabaseTest 項目中已經有一張 Book 表用於存放書的各類詳細數據,若是咱們想 再添加一張 Category 表用於記錄書籍的分類該怎麼作呢?數據庫
好比 Category 表中有 id(主鍵)、分類名和分類代碼這幾個列,那麼建表語句就能夠 寫成:ide
create table Category (工具
id integer primary key autoincrement, category_name text,this
category_code integer)code
接下來咱們將這條建表語句添加到 MyDatabaseHelper 中,代碼以下所示:blog
public class MyDatabaseHelper extends SQLiteOpenHelper {rem
public static final String CREATE_BOOK = "create table Book ("get
+ "id integer primary key autoincrement, "it
+ "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)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).
show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
看上去好像都挺對的吧,如今咱們從新運行一下程序,並點擊 Create database 按鈕,咦? 居然沒有彈出建立成功的提示。固然,你也能夠經過 adb 工具到數據庫中再去檢查一下,這 樣你會更加地確認,Category 表沒有建立成功!
其實沒有建立成功的緣由不難思考,由於此時 BookStore.db 數據庫已經存在了,以後不 管咱們怎樣點擊 Create database 按鈕,MyDatabaseHelper 中的 onCreate()方法都不會再次執 行,所以新添加的表也就沒法獲得建立了。
解決這個問題的辦法也至關簡單,只須要先將程序卸載掉,而後從新運行,這時 BookStore.db 數據庫已經不存在了,若是再點擊 Create database 按鈕,MyDatabaseHelper 中 的 onCreate()方法就會執行,這時 Category 表就能夠建立成功了。
不過經過卸載程序的方式來新增一張表毫無疑問是很極端的作法,其實咱們只須要巧妙 地運用 SQLiteOpenHelper 的升級功能就能夠很輕鬆地解決這個問題。修改 MyDatabaseHelper中的代碼,以下所示:
public class MyDatabaseHelper extends SQLiteOpenHelper {
……
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
}
能夠看到,咱們在 onUpgrade()方法中執行了兩條 DROP 語句,若是發現數據庫中已經 存在 Book 表或 Category 表了,就將這兩張表刪除掉,而後再調用 onCreate()方法去從新創 建。這裏先將已經存在的表刪除掉,是由於若是在建立表時發現這張表已經存在了,就會直 接報錯。
接下來的問題就是如何讓 onUpgrade()方法可以執行了,還記得 SQLiteOpenHelper 的構 造方法裏接收的第四個參數嗎?它表示當前數據庫的版本號,以前咱們傳入的是 1,如今只 要傳入一個比 1 大的數,就可讓 onUpgrade()方法獲得執行了。修改 MainActivity 中的代碼, 以下所示:
public class MainActivity extends Activity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
這裏將數據庫版本號指定爲 2,表示咱們對數據庫進行升級了。如今從新運行程序,並點擊 Create database 按鈕,這時就會再次彈出建立成功的提示。爲了驗證一下 Category 表是 不是已經建立成功了,咱們在 adb shell 中打開 BookStore.db 數據庫,而後鍵入.table 命令, 結果如圖 6.19 所示。
圖 6.19
接着鍵入.schema 命令查看一下建表語句,結果如圖 6.20 所示。
圖 6.20
由此能夠看出,Category 表已經建立成功了,同時也說明咱們的升級功能的確起到了做用。