<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          自學(xué)HarmonyOS應(yīng)用開(kāi)發(fā)(63)- 對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)升級(jí)

          問(wèn)題的背景

          隨著應(yīng)用開(kāi)發(fā)的不斷深入,或早或晚都會(huì)產(chǎn)生升級(jí)數(shù)據(jù)庫(kù)結(jié)構(gòu)的需求。這種升級(jí)可以是為特定的數(shù)據(jù)表添加字段,也可以是增加新表等。

          以秒表應(yīng)用為例,升級(jí)之前的表構(gòu)成如下,這個(gè)數(shù)據(jù)庫(kù)中一共包含3個(gè)表:

          @Database(entities = {TimeRecord.class, TileData.class, Setting.class}, version = 1)public abstract class StopWatchDB extends OrmDatabase {}

          假設(shè)我們需要增加第4個(gè)表TimingInfo。如果應(yīng)用還沒(méi)有發(fā)布,我們直接將這個(gè)表加進(jìn)來(lái),然后卸載應(yīng)用(這時(shí)會(huì)清除應(yīng)用數(shù)據(jù))就行了。

          @Database(entities = {TimeRecord.class, TileData.class, Setting.class, TimingInfo.class}, version = 1)public abstract class StopWatchDB extends OrmDatabase {}

          但如果應(yīng)用已經(jīng)發(fā)布并被大量用戶使用,清除已有數(shù)據(jù)重新建庫(kù)的方法就不能用了。本文介紹在保留已有數(shù)據(jù)的情況下實(shí)現(xiàn)數(shù)據(jù)庫(kù)升級(jí)的方法。


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

          以下代碼是升級(jí)數(shù)據(jù)庫(kù)的第一步,增加新表和提升版本信息。

          @Database(entities = {TimeRecord.class, TileData.class, Setting.class, TimingInfo.class}, version = 2)public abstract class StopWatchDB extends OrmDatabase {}

          注意第一行代碼的最后,version的值已經(jīng)修改為2。需要注意的是,版本號(hào)使用的是整數(shù)值。


          實(shí)現(xiàn)數(shù)據(jù)庫(kù)升級(jí)類(lèi)

          如果只是修改數(shù)據(jù)庫(kù)版本信息,在實(shí)際使用增加的新表時(shí),會(huì)發(fā)生下面的異常:

          信息是需要的表不存在。要解決這個(gè)問(wèn)題,獲取數(shù)據(jù)庫(kù)上下文時(shí),要指定版本之間進(jìn)行遷移的處理類(lèi)。

          private OrmContext getOrmContext(){    DatabaseHelper helper = new DatabaseHelper(this);    return helper.getOrmContext("StopWatch",                   "StopWatch.db",                   StopWatchDB.class,                  new TestOrmMigration12());}
          private static class TestOrmMigration12 extends OrmMigration { // 此處用于配置數(shù)據(jù)庫(kù)版本遷移的開(kāi)始版本和結(jié)束版本,super(startVersion, endVersion)即數(shù)據(jù)庫(kù)版本號(hào)從1升到2。 public TestOrmMigration12() {super(1, 2); } @Override public void onMigrate(RdbStore rdbStore) {    //數(shù)據(jù)庫(kù)升級(jí)處理    }}

          代碼第6行將TestOrmMigration12登錄到獲取數(shù)據(jù)庫(kù)上下文處理中,而代碼第11行指定了這個(gè)類(lèi)用于版本1升級(jí)到版本2的處理。


          數(shù)據(jù)升級(jí)處理

          本例中增加了一個(gè)新的TimingInfo表,我們可以自己手寫(xiě)增加表的語(yǔ)句,也可以參照開(kāi)發(fā)工具自動(dòng)生成的語(yǔ)句,這樣即省時(shí)省力,又能保證正確性。對(duì)于StopWatch應(yīng)用來(lái)說(shuō),我們可以從以下文件中找到對(duì)應(yīng)處理:

          StopWatch\entry\build\generated\source\annotation\debug\xwg\stopwatch\db\StopWatchDBImpl.java

          @Overridepublic void onCreate(RdbStore store) {    store.executeSql("CREATE TABLE IF NOT EXISTS `setting` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `segment` TEXT , `item` TEXT , `value` TEXT )");    store.executeSql("CREATE UNIQUE INDEX `index_setting_index` ON `setting` (`segment`,`item`)");    store.executeSql("CREATE TABLE IF NOT EXISTS `TimingInfo` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `startTime` INTEGER , `title` TEXT )");    store.executeSql("CREATE UNIQUE INDEX `index_time_index` ON `TimingInfo` (`startTime`)");    store.executeSql("CREATE TABLE IF NOT EXISTS `time_record` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `recordId` INTEGER , `lapNumber` INTEGER , `time` INTEGER )");    store.executeSql("CREATE UNIQUE INDEX `index_record_index` ON `time_record` (`recordId`,`lapNumber`)");    store.executeSql("CREATE TABLE IF NOT EXISTS `tile_data` (`tileId` INTEGER PRIMARY KEY AUTOINCREMENT, `type` INTEGER , `zoom` INTEGER , `tileX` INTEGER , `tileY` INTEGER , `data` BLOB )");    store.executeSql("CREATE UNIQUE INDEX `index_tile_index` ON `tile_data` (`type`,`zoom`,`tileX`,`tileY`)");}

          代碼第5,6兩行就是我們想要的。將它拷貝粘貼到TestOrmMigration12的onMigrate方法中并稍加修改即可。

          private static class TestOrmMigration12 extends OrmMigration {    // 此處用于配置數(shù)據(jù)庫(kù)版本遷移的開(kāi)始版本和結(jié)束版本,super(startVersion, endVersion)即數(shù)據(jù)庫(kù)版本號(hào)從1升到2。    public TestOrmMigration12() {super(1, 2); }    @Override    public void onMigrate(RdbStore rdbStore) {        rdbStore.executeSql("CREATE TABLE IF NOT EXISTS `TimingInfo` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `startTime` INTEGER , `title` TEXT )");        rdbStore.executeSql("CREATE UNIQUE INDEX `index_time_index` ON `TimingInfo` (`startTime`)");    }}


          參考代碼

          完整代碼可以從以下鏈接下載:

          https://github.com/xueweiguo/Harmony/tree/master/StopWatch


          參考資料

          開(kāi)發(fā)-對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)概述 (harmonyos.com)

          https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-orm-overview-0000000000030070

          開(kāi)發(fā)-對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)開(kāi)發(fā)指導(dǎo) (harmonyos.com)

          https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-orm-guidelines-0000000000030063


          作者著作介紹

          《實(shí)戰(zhàn)Python設(shè)計(jì)模式》是作者去年3月份出版的技術(shù)書(shū)籍,該書(shū)利用Python 的標(biāo)準(zhǔn)GUI 工具包tkinter,通過(guò)可執(zhí)行的示例對(duì)23 個(gè)設(shè)計(jì)模式逐個(gè)進(jìn)行說(shuō)明。這樣一方面可以使讀者了解真實(shí)的軟件開(kāi)發(fā)工作中每個(gè)設(shè)計(jì)模式的運(yùn)用場(chǎng)景和想要解決的問(wèn)題;另一方面通過(guò)對(duì)這些問(wèn)題的解決過(guò)程進(jìn)行說(shuō)明,讓讀者明白在編寫(xiě)代碼時(shí)如何判斷使用設(shè)計(jì)模式的利弊,并合理運(yùn)用設(shè)計(jì)模式。

          對(duì)設(shè)計(jì)模式感興趣而且希望隨學(xué)隨用的讀者通過(guò)本書(shū)可以快速跨越從理解到運(yùn)用的門(mén)檻;希望學(xué)習(xí)Python GUI 編程的讀者可以將本書(shū)中的示例作為設(shè)計(jì)和開(kāi)發(fā)的參考;使用Python 語(yǔ)言進(jìn)行圖像分析、數(shù)據(jù)處理工作的讀者可以直接以本書(shū)中的示例為基礎(chǔ),迅速構(gòu)建自己的系統(tǒng)架構(gòu)。




          覺(jué)得本文有幫助?請(qǐng)分享給更多人。

          關(guān)注微信公眾號(hào)【面向?qū)ο笏伎肌枯p松學(xué)習(xí)每一天!

          面向?qū)ο箝_(kāi)發(fā),面向?qū)ο笏伎迹?/span>




          瀏覽 76
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          自學(xué)HarmonyOS應(yīng)用開(kāi)發(fā)(62)- 使用對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)保存設(shè)定信息
          自學(xué)HarmonyOS應(yīng)用開(kāi)發(fā)(55)- 使用對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)保存地圖數(shù)據(jù)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费av插入 | 97色色色色 | 男人天堂网在线 | 中文字幕一区二区三区乱码视频 | 亲子伦一区二区三区 |