有關(guān)DBFlow的Migration的幾個細節(jié)

個人原創(chuàng)酸茴,轉(zhuǎn)載請注明出處:http://www.reibang.com/p/ff4fbbda2cd6

概述

DBFlow作為一款結(jié)合了簡易性與高效率的開源數(shù)據(jù)庫框架艰争,深受不少android開發(fā)者的喜愛挤渔。我之前的一個app也采用了這款框架嗅剖。最近app更新猿规,需要升級數(shù)據(jù)庫艾猜。在不需要改變表的結(jié)構(gòu)的情況下衬鱼,DBFlow的升級操作十分簡單业筏,只需要改一下版本號就行了∧倨簦可不巧我這次的更新偏偏有涉及到對表的結(jié)構(gòu)的修改驾孔,這樣一來就要用到DBFlow的Migration功能芍秆,查閱了一下官方文檔,發(fā)現(xiàn)有除了對數(shù)據(jù)本身的操作外翠勉,支持的修改數(shù)據(jù)庫結(jié)構(gòu)操作很有限(只支持對table的重命名和新增column)妖啥,一些細節(jié)也講的不是很清楚,以下都是我個人的幾個實測(踩坑)对碌。

Migration的觸發(fā)時機與執(zhí)行順序

DBFlow支持同時定義多個Migration荆虱,所有的Migration的觸發(fā)時機都是在第一次對數(shù)據(jù)庫進行操作時觸發(fā)的(而不是Application或是MainActivity創(chuàng)建時)。至于多個Migration的執(zhí)行順序朽们,先上代碼:

@Database(version = 4)
public class AppDatabase {

    @Migration(version = 2, database = AppDatabase.class, priority = 0)
    public static class Migration1 extends BaseMigration {

        @Override
        public void migrate(DatabaseWrapper database) {
          // run some code here
          SQLite.update(Employee.class)
            .set(Employee_Table.status.eq("Invalid"))
            .where(Employee_Table.job.eq("Laid Off"))
            .execute(database); // required inside a migration to pass the wrapper
        }
    }
    @Migration(version = 4, database = AppDatabase.class, priority = 0)
    public static class Migration2 extends BaseMigration {

        @Override
        public void migrate(DatabaseWrapper database) {
          // run some code here
          ...
        }
    }
}
  1. 數(shù)據(jù)庫的版本會由低到高逐步升級怀读,即假設(shè)之前的數(shù)據(jù)庫版本為1,要升級的版本為4骑脱,那么該段代碼會先執(zhí)行Migration1將版本升級到2菜枷,再執(zhí)行Migration2將版本升級到4。
  2. 只有@Migration里version高于原數(shù)據(jù)庫版本的Migration會執(zhí)行叁丧,即如果之前的版本為3啤誊,那么該段代碼只會執(zhí)行Migration2。
  3. 在version相同時拥娄,由priority決定執(zhí)行順序蚊锹,priority高的先執(zhí)行,如果version和priority都相同稚瘾,則順序不確定(盡量避免)牡昆,取決于哪個class先被找到。
  4. Migration只對已有的舊版本數(shù)據(jù)庫有效摊欠,新創(chuàng)建的數(shù)據(jù)庫不會執(zhí)行任何version > 0的Migration丢烘。

version = 0的Migration

DBFlow專門設(shè)計了version=0的Migration,用于數(shù)據(jù)庫的初始化凄硼。如果定義了這種Migration铅协,則每次數(shù)據(jù)庫創(chuàng)建時都會自動調(diào)用該Migration,并且之后版本號為最新摊沉,不會在調(diào)用其他version的Migration狐史。例如以下代碼:

@Database(version = 3)
public class AppDatabase {

    @Migration(version = 0, database = AppDatabase.class)
    public static class Migration0 extends BaseMigration {

        @Override
        public void migrate(DatabaseWrapper database) {
          // run some code here
          SQLite.update(Employee.class)
            .set(Employee_Table.status.eq("Invalid"))
            .where(Employee_Table.job.eq("Laid Off"))
            .execute(database); // required inside a migration to pass the wrapper
        }
    }
    @Migration(version = 3, database = AppDatabase.class)
    public static class Migration1 extends BaseMigration {

        @Override
        public void migrate(DatabaseWrapper database) {
          // run some code here
          ...
        }
    }
}

如果是第一次創(chuàng)建數(shù)據(jù)庫,那么只會執(zhí)行Migration0说墨,反之如果之前有舊版數(shù)據(jù)庫(version一般大于0)骏全,那么只會執(zhí)行Migration1。

Migration里的Transaction

利用DBFlow的Transaction來進行數(shù)據(jù)庫的批量操作非常簡單尼斧,尤其是速度最快的FastStoreModelTransaction姜贡,非常適合用來進行數(shù)據(jù)庫創(chuàng)建和升級時的初始化錄入數(shù)據(jù)。如

FastStoreModelTransaction transaction = FastStoreModelTransaction
                    .saveBuilder(FlowManager.getModelAdapter(Knife.class))
                    .addAll(allKnives).build();
FlowManager.getDatabase(AppDatabase.class).executeTransaction(transaction);

不過棺棵,如果用version = 0的Migration來初始化就不能這么寫楼咳,會報錯熄捍,屬于循環(huán)調(diào)用數(shù)據(jù)庫。正確的寫法是:

@Database(version = 3)
public class AppDatabase {

    @Migration(version = 0, database = AppDatabase.class)
    public static class Migration0 extends BaseMigration {

        @Override
        public void migrate(DatabaseWrapper database) {
            FastStoreModelTransaction transaction = FastStoreModelTransaction
                    .insertBuilder(FlowManager.getModelAdapter(Knife.class))
                    .addAll(allKnives).build();
            transaction.execute(database);
        }
    }
}

對數(shù)據(jù)庫的其他結(jié)構(gòu)性操作

這就需要SQL的知識了母怜,基本都是通過database.execSQL(SQLExpression)來進行余耽。比如刪除column,需要用execSQL先創(chuàng)建一張臨時表存原數(shù)據(jù)苹熏,然后刪除原表碟贾,再新建一張與原表名稱相同的不包含要刪的column的新表,最后再將臨時表的數(shù)據(jù)錄入新表中轨域。很麻煩是吧袱耽?這也是DBFlow目前為止不是很人性化的一點問題(相比之下Litepal在這點上就做的很好,雖然性能上略差一些)干发。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朱巨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铐然,更是在濱河造成了極大的恐慌蔬崩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搀暑,死亡現(xiàn)場離奇詭異,居然都是意外死亡跨琳,警方通過查閱死者的電腦和手機自点,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脉让,“玉大人桂敛,你說我怎么就攤上這事〗η保” “怎么了术唬?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滚澜。 經(jīng)常有香客問我粗仓,道長,這世上最難降的妖魔是什么设捐? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任借浊,我火速辦了婚禮,結(jié)果婚禮上萝招,老公的妹妹穿的比我還像新娘蚂斤。我一直安慰自己,他們只是感情好槐沼,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布曙蒸。 她就那樣靜靜地躺著捌治,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纽窟。 梳的紋絲不亂的頭發(fā)上具滴,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音师倔,去河邊找鬼构韵。 笑死,一個胖子當著我的面吹牛趋艘,可吹牛的內(nèi)容都是我干的疲恢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓷胧,長吁一口氣:“原來是場噩夢啊……” “哼显拳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搓萧,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杂数,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘸洛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揍移,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年反肋,在試婚紗的時候發(fā)現(xiàn)自己被綠了那伐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡石蔗,死狀恐怖罕邀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情养距,我是刑警寧澤诉探,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站棍厌,受9級特大地震影響肾胯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜定铜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一阳液、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揣炕,春花似錦帘皿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虽填。三九已至,卻和暖如春曹动,著一層夾襖步出監(jiān)牢的瞬間斋日,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工墓陈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恶守,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓贡必,卻偏偏與公主長得像兔港,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仔拟,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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