GreenDao與Sqlite的數(shù)據(jù)庫(kù)版本升級(jí)策略

目錄.png


一.簡(jiǎn)介

我們?cè)陂_發(fā)應(yīng)用的時(shí)候,存儲(chǔ)數(shù)據(jù)可能會(huì)用到數(shù)據(jù)庫(kù)。第一個(gè)版本時(shí)所設(shè)計(jì)的數(shù)據(jù)庫(kù)結(jié)構(gòu),如果在以后的app版本中需要增加業(yè)務(wù)邏輯,數(shù)據(jù)庫(kù)的表可能要做相應(yīng)的修改,那么原來的數(shù)據(jù)庫(kù)結(jié)構(gòu)就不能用了,這時(shí)就需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行升級(jí)。

二.升級(jí)方案

1.讓用戶將應(yīng)用卸載然后再安裝最新版本的app

2.對(duì)數(shù)據(jù)庫(kù)進(jìn)行升級(jí),對(duì)于第一種方案,用戶卸載老版本就會(huì)造成數(shù)據(jù)丟失,這樣對(duì)于用戶的體驗(yàn)性極差,不到萬不得已的時(shí)候不要做。我們傾向于選擇第二項(xiàng)方案。

三.不同版本升級(jí)分析

3.1.Version1.0

當(dāng)我們開發(fā)第一個(gè)版本數(shù)據(jù)庫(kù)的時(shí)候,SQLiteOpenHelper的繼承類里會(huì)走onCreate()方法,即 —->v1.0 走onCreate(),這時(shí)候并不涉及更新的方法。

3.2.Version2.0

當(dāng)我們開發(fā)到第二個(gè)數(shù)據(jù)庫(kù)版本的時(shí)候,分兩種情況:

(1) 用戶從1.0版本升級(jí)到2.0版本 SQLiteOpenHelper的繼承類里會(huì)走onUpgrade()方法,不走onCreate()方法。即v1.0—->v2.0 走onUpgrade();

(2) 如果是用戶直接安裝v2.0 , SQLiteOpenHelper的繼承類里會(huì)走onCreate()方法,不走onUpgrade()方法。即 —->v2.0 走onCreate()

3.3.Version3.0

(1) 用戶從1.0版本升級(jí)到3.0版本 ,SQLiteOpenHelper的繼承類里會(huì)走onUpgrade()方法,不走onCreate()方法。即v1.0—->v3.0 走onUpgrade()

(2) 用戶從2.0版本升級(jí)到3.0版本 ,SQLiteOpenHelper的繼承類里會(huì)走onUpgrade()方法,不走onCreate()方法。即v2.0—->v3.0 走onUpgrade()

(3) 如果是用戶直接安裝3.0 ,SQLiteOpenHelper的繼承類里會(huì)走onCreate()方法,不走onUpgrade()方法。即 —->v3.0 走onCreate()

如下圖:


版本升級(jí)方法分析.png

只要是第一次安裝或者第一個(gè)數(shù)據(jù)庫(kù)版本的都走onCreate()方法,而不走onUpgrade()方法,從低版本升級(jí)到高版本的都走onUpgrade()方法而不走onCreate()方法。

四.代碼分析

4.1第一個(gè)數(shù)據(jù)庫(kù)版本

只走onCreate(),所以我們可以把創(chuàng)建表的方法寫在這個(gè)方法里。


另外需要注意的是,我們要把創(chuàng)建SQLiteOpenHelper子類的地方寫成單例模式,這樣可以避免重復(fù)創(chuàng)建,出現(xiàn)問題。



此時(shí)的DataBaseConfig.DATABASE_NEW_VERSION 為1

點(diǎn)擊獲取低版本信息按鈕


數(shù)據(jù)庫(kù)版本1.png

如果以后的需求改變,需要往數(shù)據(jù)庫(kù)里加字段或者改字段,需要升級(jí)數(shù)據(jù)庫(kù)。

4.2第二個(gè)數(shù)據(jù)庫(kù)版本

如果是從v1.0升級(jí)到v2.0,則走onUpgrade,如果是直接安裝v2.0,則走onCreate()

4.2.1. 比如從v1.0升級(jí)到v2.0 需要增加字段


此時(shí) DataBaseConfig.DATABASE_NEW_VERSION 為2 ,DataBaseConfig.DATABASE_FIRST_VERSION為1


數(shù)據(jù)庫(kù)版本2.png

版本2比版本1中新增了sex,和address字段,比版本1多了兩項(xiàng),由于代碼中默認(rèn)的性別是女,所以前三個(gè)的性別是女。

????? 注:還要再處理onCreate(),因?yàn)橛脩艨赡苁侵苯影惭bV2.0

????? 有兩種方法:

(1)執(zhí)行舊版數(shù)據(jù)庫(kù)sql,則后面還要調(diào)用onUpgrade


(2)執(zhí)行新版數(shù)據(jù)庫(kù)sql,不需要調(diào)用onUpgrade


4.2.2. 第二個(gè)版本數(shù)據(jù)庫(kù)需要新增并修改字段

??????? 注:比如從v1.0升級(jí)到v2.0 需要增加字段

??????????? 新增sex,address字段,修改age–>sign


此時(shí) DataBaseConfig.DATABASE_NEW_VERSION 為2 ,DataBaseConfig.DATABASE_FIRST_VERSION為1


增加修改字段.png

從圖中可以看出,已經(jīng)將age選項(xiàng)修改為簽名sign了,增加了sex,address兩個(gè)選項(xiàng)。

處理onCreate()方法同增加字段里的處理一致。

五.總結(jié)

本文總結(jié)了數(shù)據(jù)庫(kù)升級(jí)的相關(guān)內(nèi)容,包括為什么要升級(jí)數(shù)據(jù)庫(kù),怎么升級(jí)數(shù)據(jù)庫(kù),新增字段和修改字段怎么處理,如有發(fā)現(xiàn)問題,歡迎討論,共同學(xué)習(xí)。

GreenDao數(shù)據(jù)庫(kù)升級(jí)

不斷版本迭代,一些數(shù)據(jù)庫(kù)中的結(jié)構(gòu)也要發(fā)生改變、優(yōu)化,但如果貿(mào)然修改數(shù)據(jù)庫(kù)的版本號(hào),只會(huì)把舊數(shù)據(jù)庫(kù)的數(shù)據(jù)刪除,再重新創(chuàng)建新表,導(dǎo)致舊數(shù)據(jù)丟失,這樣的做法明顯是不可取的。于是我們需要數(shù)據(jù)庫(kù)的升級(jí),也要保證舊數(shù)據(jù)保留。

新建MyDevOpenHelper,繼承DaoMaster.DevOpenHelper,重寫onUpgrade(Database db, int oldVersion, int newVersion)方法,在該方法中使用MigrationHelper進(jìn)行數(shù)據(jù)庫(kù)升級(jí)以及數(shù)據(jù)遷移。


新建MyDevOpenHelper

MigrationHelper由網(wǎng)上一位大神攥寫,鏈接:https://stackoverflow.com/questions/13373170/greendao-schema-update-and-data-migration/30334668#30334668,有兩個(gè)版本,后面一個(gè)適合GreenDao3.0版本,自行選用。


自定義MyDevOpenHelper獲取數(shù)據(jù)庫(kù)

注意:表中的數(shù)據(jù)類型是基礎(chǔ)數(shù)據(jù)類型的包裝類,用Long而不是long,否則會(huì)報(bào)錯(cuò)。合并數(shù)據(jù)后,舊數(shù)據(jù)表中沒有的字段值或賦null值。原來的參與數(shù)據(jù)庫(kù)的實(shí)體類需要重新生成構(gòu)造方法和getter/setter。

build項(xiàng)目后,排除所有異常后,在build.gradle文件中配置的greedao中修改數(shù)據(jù)庫(kù)版本號(hào),遞增1


更新數(shù)據(jù)庫(kù)版本號(hào)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容