sqlite數(shù)據(jù)庫升級(jí)

Android SQLite數(shù)據(jù)庫版本升級(jí)的管理實(shí)現(xiàn)

我們知道在SQLiteOpenHelper的構(gòu)造方法:

super``(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

中最后一個(gè)參數(shù)表示數(shù)據(jù)庫的版本號(hào).當(dāng)新的版本號(hào)大于當(dāng)前的version時(shí)會(huì)調(diào)用方法:

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

所以我們的重點(diǎn)是在該方法中實(shí)現(xiàn)SQLite數(shù)據(jù)庫版本升級(jí)的管理

當(dāng)我們項(xiàng)目剛開始的時(shí)候第一版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ù)庫版本升級(jí)的管理實(shí)現(xiàn)

*

* 參考資料:

* [http://blog.csdn.net/guolin_blog](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寫成單例的.

//否則當(dāng)在一個(gè)for循環(huán)中頻繁調(diào)用openHelper.getWritableDatabase()時(shí)

//會(huì)報(bào)錯(cuò),提示數(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ù)項(xiàng)目需求,需要添加一張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寫成單例的.

//否則當(dāng)在一個(gè)for循環(huán)中頻繁調(diào)用openHelper.getWritableDatabase()時(shí)

//會(huì)報(bào)錯(cuò),提示數(shù)據(jù)庫沒有執(zhí)行關(guān)閉操作

static synchronized DataBaseOpenHelper getDBInstance(Context context) {

if (mDataBaseOpenHelper == null``) {

//改動(dòng)1

mDataBaseOpenHelper = new DataBaseOpenHelper(context,DATABASE_NAME,``null``,``2``);

}

return mDataBaseOpenHelper;

}

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_PERSON);

//改動(dòng)2

db.execSQL(CREATE_STUDENT);

}

@Override

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

//改動(dòng)3

switch (oldVersion) {

case 1``:

db.execSQL(CREATE_STUDENT);

default``:

}

}

}

較版本一在版本二中有三處修改的地方:

1 版本號(hào)變成了2

2 在onCreate()方法中添加了代碼db.execSQL(CREATE_STUDENT);創(chuàng)建student表

因?yàn)橛械挠脩舾揪蜎]有第一版本的APP,直接從市場下載了第二版本的App。所以當(dāng)然會(huì)執(zhí)行onCreate()而不會(huì)執(zhí)行onUpgrade()

3 在onUpgrade()做了處理:當(dāng)oldVersion為1時(shí)調(diào)用db.execSQL(CREATE_STUDENT);創(chuàng)建student表
因?yàn)橛械挠脩羰謾C(jī)上本來就有第一版本的APP舀瓢,所以在App升級(jí)到第二版本時(shí)會(huì)執(zhí)行onUpgrade(),不會(huì)執(zhí)行onCreate()

通過這樣的處理使得不同的情況下使用第二版APP時(shí)都會(huì)生成student表

又過了一個(gè)月,根據(jù)項(xiàng)目變更抖苦,需要給person表添加一個(gè)字段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;

//改動(dòng)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寫成單例的.

//否則當(dāng)在一個(gè)for循環(huán)中頻繁調(diào)用openHelper.getWritableDatabase()時(shí)

//會(huì)報(bào)錯(cuò),提示數(shù)據(jù)庫沒有執(zhí)行關(guān)閉操作

static synchronized DataBaseOpenHelper getDBInstance(Context context) {

if (mDataBaseOpenHelper == null``) {

//改動(dòng)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);

//改動(dòng)3

case 2``:

db.execSQL(ALTER_PERSON);

default``:

}

}

}

較版本二在版本三中有三處修改的地方:

1 改變了CREATE_PERSON語句窄瘟,在改語句中增加了一個(gè)字段genderid

和前面的描述類似,有的用戶第一次安裝該APP時(shí)就直接下載了第三版

2 修改版本號(hào)為3

應(yīng)對(duì)了用戶從第一版本或者第二版本升級(jí)到第三版本的情況(見下分析)

3 在onUpgrade()方法中)做了處理:當(dāng)oldVersion為2時(shí)調(diào)用 db.execSQL(ALTER_PERSON);修改person表趟卸,增加genderid字段

應(yīng)對(duì)了用戶從第二版本升級(jí)到第三版本的情況(見下分析)

注意一個(gè)問題:為什么這里的switch語句在每個(gè)case中沒有break蹄葱??锄列?

這是為了保證跨版本升級(jí)的時(shí)候每次數(shù)據(jù)庫的升級(jí)都會(huì)執(zhí)行到图云。

比如從第二版升級(jí)到第三版本,那么case 2會(huì)被執(zhí)行右蕊。

比如從第一版直接升級(jí)到第三版本琼稻,那么case 1肯定會(huì)被調(diào)用,由于沒有break所以會(huì)穿透switch語句又執(zhí)行case 2語句繼續(xù)升級(jí)饶囚,從而保證了數(shù)據(jù)的所有版本中的升級(jí)都會(huì)被執(zhí)行到帕翻。

如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀萝风,希望能幫助到大家嘀掸,謝謝大家對(duì)本站的支持!

文章引用:https://www.jb51.net/article/122846.htm

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末规惰,一起剝皮案震驚了整個(gè)濱河市睬塌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歇万,老刑警劉巖揩晴,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贪磺,居然都是意外死亡硫兰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門寒锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劫映,“玉大人,你說我怎么就攤上這事刹前∮靖常” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵喇喉,是天一觀的道長祖今。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么千诬? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任撒踪,我火速辦了婚禮,結(jié)果婚禮上大渤,老公的妹妹穿的比我還像新娘制妄。我一直安慰自己,他們只是感情好泵三,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布耕捞。 她就那樣靜靜地躺著,像睡著了一般烫幕。 火紅的嫁衣襯著肌膚如雪俺抽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天较曼,我揣著相機(jī)與錄音磷斧,去河邊找鬼。 笑死捷犹,一個(gè)胖子當(dāng)著我的面吹牛弛饭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萍歉,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼侣颂,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了枪孩?” 一聲冷哼從身側(cè)響起憔晒,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔑舞,沒想到半個(gè)月后拒担,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攻询,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年从撼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜕窿。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谋逻,死狀恐怖呆馁,靈堂內(nèi)的尸體忽然破棺而出桐经,到底是詐尸還是另有隱情,我是刑警寧澤浙滤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布阴挣,位于F島的核電站,受9級(jí)特大地震影響纺腊,放射性物質(zhì)發(fā)生泄漏畔咧。R本人自食惡果不足惜茎芭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望誓沸。 院中可真熱鬧梅桩,春花似錦、人聲如沸拜隧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洪添。三九已至垦页,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間干奢,已是汗流浹背痊焊。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忿峻,地道東北人薄啥。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像逛尚,于是被迫代替她去往敵國和親罪佳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359