android: SQLite升級數據庫

若是你足夠細心,必定會發現 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 表已經建立成功了,同時也說明咱們的升級功能的確起到了做用。

相關文章
相關標籤/搜索