數(shù)據(jù)庫升級(1)

數(shù)據(jù)庫升級的意義

我們在開發(fā)Android應(yīng)用的時候剪芍,不可避免地要使用數(shù)據(jù)庫岔擂。而數(shù)據(jù)庫的結(jié)構(gòu)在第一版的時候定下來睬辐,之后發(fā)布功能更新,或增加業(yè)務(wù)邏輯症汹,原來的數(shù)據(jù)庫結(jié)構(gòu)可能就不適用了硫朦。而如果數(shù)據(jù)庫的結(jié)構(gòu)與之前版本的結(jié)構(gòu)不同,新版本的應(yīng)用讀取舊數(shù)據(jù)庫肯定會出問題背镇。解決辦法只有兩種:

1.讓用戶卸載老版本再安裝新的程序咬展;

2.軟件自行更新數(shù)據(jù)庫結(jié)構(gòu)。

第一種辦法很明顯不具備可操作性芽世,而且用戶一旦卸載軟件挚赊,數(shù)據(jù)就丟失了,這是不能容忍的事情济瓢。因此荠割,作為開發(fā)者必須妥善處理數(shù)據(jù)庫的升級問題。

當然了旺矾,有的同學會說蔑鹦,這問題沒意義嘛。我們在設(shè)計軟件的時候就把數(shù)據(jù)庫設(shè)計得完備一點就好了箕宙,一開始就考慮周全嚎朽,以后再也不用管升級的事情。這種方法理論上雖然可行柬帕,但實際操作起來是非常困難的哟忍,除非你在開發(fā)定制軟件(例如某些和硬件結(jié)合的產(chǎn)品,其硬件發(fā)布之后就不再更新或很少更新陷寝,這樣的軟件確實沒多大改動)锅很。對于面向市場的應(yīng)用來說,很可能在立項之初根本不會知道以后會增加哪些功能凤跑。這樣爆安,我們終究還是要面對這個問題。

保留數(shù)據(jù)的升級

現(xiàn)在以一個假想的程序數(shù)據(jù)庫來談如何保留原有的數(shù)據(jù)庫進行升級仔引。為直觀起見扔仓,這里在每次軟件版本安裝之后導出了數(shù)據(jù)庫文件褐奥,并使用SQLite Studio顯示表結(jié)構(gòu)和內(nèi)容,過程從略翘簇。并且為了代碼的簡潔撬码,省略了一些異常處理。我們假設(shè)數(shù)據(jù)庫有這樣三個版本:

v1:t_user(username, password);

v2:t_user(username, password),t_region(region, code);

v3:t_user(username, password),t_region(region, code, country);

可以看出缘揪,第一次升級增加了一張表耍群,而第二次升級修改了表的定義。

創(chuàng)建和升級數(shù)據(jù)表的基本知識

我們在使用數(shù)據(jù)庫之前找筝,基本上會自定義一個類繼承自SQLiteOpenHelper蹈垢。該類的其中一個構(gòu)造函數(shù)形式是這樣的(另一個多出來一個DatabaseErrorHandler):

publicSQLiteOpenHelper(Context context, String name,? ? ? ? ? ? ? ? ? ? CursorFactory factory,intversion) {this(context, name, factory, version,null);? ? }

這個構(gòu)造函數(shù)里面的version參數(shù)即是我們設(shè)定的版本號。第一次使用數(shù)據(jù)庫時傳遞的這個版本將被系統(tǒng)記錄袖裕,并調(diào)用SQLiteOpenHelper#onCreate()方法進行建表操作曹抬。后續(xù)傳入的版本如果比這個高,則會調(diào)用SQLiteOpenHelper#onUpgrade()方法進行升級急鳄。

增加一張表

很明顯谤民,增加新表(或者刪除沒有外鍵的表)的操作代價很小,只需要在onUpgrade()中寫好建表操作和插入初始數(shù)據(jù)就好了疾宏。

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {if (oldVersion==1){db.execSQL("CREATETABLEt_region(_idintegerprimarykey"+ "autoincrement, regionvarchar, codevarchar)");//insert data...}}

從上面的圖里可以看到张足,新版本的數(shù)據(jù)庫中已經(jīng)有t_region表了。

修改表定義

SQLite數(shù)庫對ALTER TABLE命令支持非常有限坎藐,只能在表末尾添加列为牍,不能修改列定義,不能刪除已有的列岩馍。那么如果要修改表呢碉咆?我們可以采用臨時表的辦法。具體來說有四步:

將現(xiàn)有表重命名為臨時表蛀恩;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疫铜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子双谆,更是在濱河造成了極大的恐慌壳咕,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顽馋,死亡現(xiàn)場離奇詭異谓厘,居然都是意外死亡,警方通過查閱死者的電腦和手機趣避,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來新翎,“玉大人程帕,你說我怎么就攤上這事住练。” “怎么了愁拭?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵讲逛,是天一觀的道長。 經(jīng)常有香客問我岭埠,道長盏混,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任惜论,我火速辦了婚禮许赃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馆类。我一直安慰自己混聊,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布乾巧。 她就那樣靜靜地躺著句喜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沟于。 梳的紋絲不亂的頭發(fā)上咳胃,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音旷太,去河邊找鬼展懈。 笑死,一個胖子當著我的面吹牛泳秀,可吹牛的內(nèi)容都是我干的标沪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼嗜傅,長吁一口氣:“原來是場噩夢啊……” “哼金句!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吕嘀,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤违寞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后偶房,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趁曼,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年棕洋,在試婚紗的時候發(fā)現(xiàn)自己被綠了挡闰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摄悯,靈堂內(nèi)的尸體忽然破棺而出赞季,到底是詐尸還是另有隱情,我是刑警寧澤奢驯,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布申钩,位于F島的核電站,受9級特大地震影響瘪阁,放射性物質(zhì)發(fā)生泄漏撒遣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一管跺、第九天 我趴在偏房一處隱蔽的房頂上張望义黎。 院中可真熱鬧,春花似錦伙菜、人聲如沸轩缤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火的。三九已至,卻和暖如春淑倾,著一層夾襖步出監(jiān)牢的瞬間馏鹤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工娇哆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留湃累,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓碍讨,卻偏偏與公主長得像治力,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勃黍,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容