Android SQLite數(shù)據(jù)庫版本升級的管理實現(xiàn)
Android SQLite數(shù)據(jù)庫版本升級的管理實現(xiàn)
我們知道在SQLiteOpenHelper的構(gòu)造方法:
super(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
中最后一個參數(shù)表示數(shù)據(jù)庫的版本號.當新的版本號大于當前的version時會調(diào)用方法:
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
所以我們的重點是在該方法中實現(xiàn)SQLite數(shù)據(jù)庫版本升級的管理
當我們項目剛開始的時候第一版SQLiteOpenHelper是這樣寫的:
package cc.database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Demo描述:
* SQLite數(shù)據(jù)庫版本升級的管理實現(xiàn)
*
* 參考資料:
* http://blog.csdn.net/guolin_blog
* Thank you very much
*/
public class DataBaseOpenHelper extends SQLiteOpenHelper {
private final static String DATABASE_NAME="test.db";
private static DataBaseOpenHelper mDataBaseOpenHelper;
public static final String CREATE_PERSON=
"create table person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))";
public DataBaseOpenHelper(Context context,String name,CursorFactory factory,int version) {
super(context, name, factory, version);
}
//注意:
//將DataBaseOpenHelper寫成單例的.
//否則當在一個for循環(huán)中頻繁調(diào)用openHelper.getWritableDatabase()時
//會報錯,提示數(shù)據(jù)庫沒有執(zhí)行關(guān)閉操作
static synchronized DataBaseOpenHelper getDBInstance(Context context) {
if (mDataBaseOpenHelper == null) {
mDataBaseOpenHelper = new DataBaseOpenHelper(context,DATABASE_NAME,null,1);
}
return mDataBaseOpenHelper;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_PERSON);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
在幾天之后根據(jù)項目需求,需要添加一張student表,于是DataBaseOpenHelper就出現(xiàn)了第二版:
package cc.database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DataBaseOpenHelper extends SQLiteOpenHelper {
private final static String DATABASE_NAME="test.db";
private static DataBaseOpenHelper mDataBaseOpenHelper;
public static final String CREATE_PERSON=
"create table person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))";
public static final String CREATE_STUDENT=
"create table student(studentid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))";
public DataBaseOpenHelper(Context context,String name,CursorFactory factory,int version) {
super(context, name, factory, version);
}
//注意:
//將DataBaseOpenHelper寫成單例的.
//否則當在一個for循環(huán)中頻繁調(diào)用openHelper.getWritableDatabase()時
//會報錯,提示數(shù)據(jù)庫沒有執(zhí)行關(guān)閉操作
static synchronized DataBaseOpenHelper getDBInstance(Context context) {
if (mDataBaseOpenHelper == null) {
//改動1
mDataBaseOpenHelper = new DataBaseOpenHelper(context,DATABASE_NAME,null,2);
}
return mDataBaseOpenHelper;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_PERSON);
//改動2
db.execSQL(CREATE_STUDENT);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//改動3
switch (oldVersion) {
case 1:
db.execSQL(CREATE_STUDENT);
default:
}
}
}
較版本一在版本二中有三處修改的地方:
1 版本號變成了2
2 在onCreate()方法中添加了代碼db.execSQL(CREATE_STUDENT);創(chuàng)建student表
因為有的用戶根本就沒有第一版本的APP,直接從市場下載了第二版本的App。所以當然會執(zhí)行onCreate()而不會執(zhí)行onUpgrade()
3 在onUpgrade()做了處理:當oldVersion為1時調(diào)用db.execSQL(CREATE_STUDENT);創(chuàng)建student表
因為有的用戶手機上本來就有第一版本的APP,所以在App升級到第二版本時會執(zhí)行onUpgrade(),不會執(zhí)行onCreate()
通過這樣的處理使得不同的情況下使用第二版APP時都會生成student表
又過了一個月,根據(jù)項目變更,需要給person表添加一個字段genderid,于是DataBaseOpenHelper就出現(xiàn)了第三版:
package cc.database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DataBaseOpenHelper extends SQLiteOpenHelper {
private final static String DATABASE_NAME="test.db";
private static DataBaseOpenHelper mDataBaseOpenHelper;
//改動1
public static final String CREATE_PERSON=
"create table person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12)),genderid integer)";
public static final String ALTER_PERSON="alter table person add column genderid integer";
public static final String CREATE_STUDENT=
"create table student(studentid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))";
public DataBaseOpenHelper(Context context,String name,CursorFactory factory,int version) {
super(context, name, factory, version);
}
//注意:
//將DataBaseOpenHelper寫成單例的.
//否則當在一個for循環(huán)中頻繁調(diào)用openHelper.getWritableDatabase()時
//會報錯,提示數(shù)據(jù)庫沒有執(zhí)行關(guān)閉操作
static synchronized DataBaseOpenHelper getDBInstance(Context context) {
if (mDataBaseOpenHelper == null) {
//改動2
mDataBaseOpenHelper = new DataBaseOpenHelper(context,DATABASE_NAME,null,3);
}
return mDataBaseOpenHelper;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_PERSON);
db.execSQL(CREATE_STUDENT);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
db.execSQL(CREATE_STUDENT);
//改動3
case 2:
db.execSQL(ALTER_PERSON);
default:
}
}
}
較版本二在版本三中有三處修改的地方:
1 改變了CREATE_PERSON語句,在改語句中增加了一個字段genderid
和前面的描述類似,有的用戶第一次安裝該APP時就直接下載了第三版
2 修改版本號為3
應對了用戶從第一版本或者第二版本升級到第三版本的情況(見下分析)
3 在onUpgrade()方法中)做了處理:當oldVersion為2時調(diào)用 db.execSQL(ALTER_PERSON);修改person表,增加genderid字段
應對了用戶從第二版本升級到第三版本的情況(見下分析)
注意一個問題:為什么這里的switch語句在每個case中沒有break???
這是為了保證跨版本升級的時候每次數(shù)據(jù)庫的升級都會執(zhí)行到。
比如從第二版升級到第三版本,那么case 2會被執(zhí)行。
比如從第一版直接升級到第三版本,那么case 1肯定會被調(diào)用,由于沒有break所以會穿透switch語句又執(zhí)行case 2語句繼續(xù)升級,從而保證了數(shù)據(jù)的所有版本中的升級都會被執(zhí)行到。
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
詳解Android WebView監(jiān)聽console錯誤信息
這篇文章主要介紹了Android WebView監(jiān)聽console錯誤信息,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Android ListView數(shù)據(jù)的分批顯示功能
本文通過實例代碼給大家分享了Android ListView數(shù)據(jù)的分批顯示功能,非常不錯具有參考借鑒價值,需要的朋友參考下吧2017-04-04
Android使用ViewDragHelper實現(xiàn)仿QQ6.0側(cè)滑界面(一)
這篇文章主要介紹了Android使用ViewDragHelper實現(xiàn)仿QQ6.0側(cè)滑界面(一)的相關(guān)資料,需要的朋友可以參考下2016-02-02
深入理解TextView實現(xiàn)Rich Text--在同一個TextView設(shè)置不同字體風格
本篇文章是對Android中在同一個TextView中設(shè)置不同的字體風格進行了詳細的分析介紹,需要的朋友參考下2013-05-05
Android自定義布局實現(xiàn)仿qq側(cè)滑部分代碼
這篇文章主要為大家詳細介紹了自定義布局實現(xiàn)仿qq側(cè)滑Android部分代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03

