Android資料庫使用指南(下)
上一節中,我們講到了怎麼建立一個數據庫,以及對資料庫中對錶中的資料,進行增刪改查,主要操作的物件是表中的資料,這一章,我們將會講解怎麼對資料庫中的表進行操作。
那麼表可以做那些操作呢,比如刪除表啊,修改表中的某個欄位啊,新增表中的欄位啊,總之就是資料庫中的表,發生變化,除了剛剛說的那些變化,新增表也是變化之一。
那麼有人就問了,為什麼要對資料庫中對錶作變化啊,你想啊,假設我們建個表只想記名字和年齡,後來突然又說要把性別也記錄下來,但是之前的表已經存在了啊,難道還刪了重新建個表不成,肯定不行啊,刪了表資料就沒有了啊,所以要對資料庫作升級。
前言
上面已經說了,對錶進行修改,其實就是對資料庫進行升級,刪除表也算升級啊,反正就是發生變化,資料庫就需要升級。 所以老實說其實有個地方決定了資料庫的版本
public class DBHelper extends SQLiteOpenHelper {
public static final String db_name = "test.db";
public DBHelper(Context context, int version) {
super(context, db_name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (" +
" _byte byte," +
" _long long," +
" _text text," +
" _short short," +
" _int int," +
" _float float," +
" _double double," +
" _boolean boolean," +
" _blob blob" +
")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
看看這個構造方法,其中第二個引數就是資料庫版本號,你可以在第一次釋出應用的時候,這個版本號填寫1,然後下一個版本,版本號填寫2,但是資料庫升級可沒有那麼簡單的單純改個數字就升級完畢了。
是時候好好的介紹一下onCreate
和onUpgrade
方法了。
onCreate:在建立資料庫的時候,呼叫該方法,如果資料庫已經存在了,這個方法將不會被呼叫。
onUpgrade:當構造方法中的那個version,也就是資料庫版本升高了的時候,這個方法才會被呼叫。 比如,第一次釋出應用的時候,這裡的version是1,第二次釋出應用的時候,剛好資料庫要新建一個表,然後需要升級一下資料庫,這裡於是就傳遞了個2,這時候onUpgrade方法就會被呼叫了,不過onCreate方法可不會被呼叫了啊,因為資料庫已經存在了。
這裡有一點要提一下,資料庫只能升級,不能降級,不然會報錯的。
建立資料庫
上面大概說了,onCreate
和onUpgrade
方法大概是在什麼時候被呼叫的,所以基於這個原理。如果我們要新增表或者修改表,我們就在onUpgrade方法中寫。這裡舉個例子,假設我們已經發布了資料庫版本為1的應用。
資料庫建立如下:
public class DBHelper extends SQLiteOpenHelper {
public static final String db_name = "test.db";
public DBHelper(Context context, int version) {
super(context, db_name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (_text text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
此時我們呼叫的方式為:
// 當前資料庫的版本為1
new DBHelper(context, 1)
其實我們就建立了一個表名為table1的表而已,不妨執行後來看看,資料庫檔案儲存在data/data/包名/databases/xxx.db
表也建立好了
看看錶中欄位
都沒有問題,接下來,我們開始升級資料庫,比如,新建表。
資料庫升級-新增表
接下來,我們新增一個表,所以就應該這樣寫:
public class DBHelper extends SQLiteOpenHelper {
public static final String db_name = "test.db";
public DBHelper(Context context, int version) {
super(context, db_name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (_text text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion) {
case 1:
case 2:
// 新增表table2
db.execSQL("create table table2 (_text text)");
break;
}
}
}
所以在用的時候,就應該這樣用:
// 當前資料庫的版本為2
new DBHelper(context, 2)
看看?
沒啥問題
資料庫升級-刪除表
其實主要還是呼叫SQL語句執行任務,所以:
public class DBHelper extends SQLiteOpenHelper {
public static final String db_name = "test.db";
public DBHelper(Context context, int version) {
super(context, db_name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (_text text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion) {
case 1:
case 2:
db.execSQL("create table table2 (_text text)");
case 3:
db.execSQL("drop table table2");
break;
}
}
}
使用:
// 當前資料庫的版本為3
new DBHelper(context, 3)
資料庫升級-新增欄位
給某個表新增欄位:
public class DBHelper extends SQLiteOpenHelper {
public static final String db_name = "test.db";
public DBHelper(Context context, int version) {
super(context, db_name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (_text text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion) {
case 1:
case 2:
db.execSQL("create table table2 (_text text)");
case 3:
db.execSQL("drop table table2");
case 4:
db.execSQL("alter table table1 ADD _long long");
break;
}
}
}
使用:
// 當前資料庫的版本為4
new DBHelper(context, 4)
總結
大概差不多就是以這種方式對資料庫進行升級,這裡主要是使用sql語句對資料庫進行操作,如果對sql語句不熟悉的人,可能需要在使用前查詢一下了。 這裡大概說幾種常用的sql語句的結構:
新增表:
create table 表名 (欄位 型別)
刪除表:
drop table 表名
修改表-新增表字段
alter table 表名 add 欄位 型別
修改表-刪除欄位
alter table 表名 drop column 欄位名
SQLite支援正常的SQL語句,只需要呼叫SQLiteDatabase物件的execSQL方法就可以直接通過SQL語句對資料庫進行操作了
還有一點要說明的就是,為啥onUpgrade方法中的switch,不是每個case都對應一個break,這裡其實是一個小技巧,我們在使用資料庫升級的時候,往往switch這裡是這樣寫的:
switch (newVersion) {
case 1:
// 更新1
case 2:
// 更新2
case 3:
// 更新3
case 4:
// 更新4
case 5:
// 更新5
case 6:
// 更新6
case 7:
// 更新7
...
break;
}
因為這樣寫有一個好處,假設我們的應用,最新版已經升級到第7個版本了,但是有的使用者還在用第4個版本,這時候,如果這個使用者直接升級到最新的第7版,這裡的執行,就會是
更新5
更新6
更新7
就把以前遺漏的更新全部趕上了,這就這樣寫的好處。
本章主要就是講資料庫升級,流程大概就是這麼個流程,就這樣吧!