专栏首页C++核心准则原文翻译自学HarmonyOS应用开发(63)- 对象关系映射数据库升级

自学HarmonyOS应用开发(63)- 对象关系映射数据库升级

问题的背景

随着应用开发的不断深入,或早或晚都会产生升级数据库结构的需求。这种升级可以是为特定的数据表添加字段,也可以是增加新表等。

以秒表应用为例,升级之前的表构成如下,这个数据库中一共包含3个表:

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

假设我们需要增加第4个表TimingInfo。如果应用还没有发布,我们直接将这个表加进来,然后卸载应用(这时会清除应用数据)就行了。

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

但如果应用已经发布并被大量用户使用,清除已有数据重新建库的方法就不能用了。本文介绍在保留已有数据的情况下实现数据库升级的方法。

升级数据库版本

以下代码是升级数据库的第一步,增加新表和提升版本信息。

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

注意第一行代码的最后,version的值已经修改为2。需要注意的是,版本号使用的是整数值。

实现数据库升级类

如果只是修改数据库版本信息,在实际使用增加的新表时,会发生下面的异常:

信息是需要的表不存在。要解决这个问题,获取数据库上下文时,要指定版本之间进行迁移的处理类。:

private OrmContext getOrmContext(){
    DatabaseHelper helper = new DatabaseHelper(this);
    return helper.getOrmContext("StopWatch", 
                  "StopWatch.db", 
                  StopWatchDB.class,
                  new TestOrmMigration12());
}

private static class TestOrmMigration12 extends OrmMigration {
    // 此处用于配置数据库版本迁移的开始版本和结束版本,super(startVersion, endVersion)即数据库版本号从1升到2。
    public TestOrmMigration12() {super(1, 2); }
    @Override
    public void onMigrate(RdbStore rdbStore) {
    //数据库升级处理
    }
}

代码第6行将TestOrmMigration12登录到获取数据库上下文处理中,而代码第11行指定了这个类用于版本1升级到版本2的处理。

数据升级处理

本例中增加了一个新的TimingInfo表,我们可以自己手写增加表的语句,也可以参照开发工具自动生成的语句,这样即省时省力,又能保证正确性。对于StopWatch应用来说,我们可以从以下文件中找到对应处理:

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

@Override
public 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 {
    // 此处用于配置数据库版本迁移的开始版本和结束版本,super(startVersion, endVersion)即数据库版本号从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

参考资料

开发-对象关系映射数据库概述 (harmonyos.com)

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

开发-对象关系映射数据库开发指导 (harmonyos.com)

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

作者著作介绍

《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自学HarmonyOS应用开发(55)- 使用对象关系映射数据库保存地图数据

    前一篇文章实现了地图数据的正确表示,但是由于每次执行都需要至少一次从网上获取地图数据,不可避免地产生显示延迟。本文介绍利用对象数据库储存已经获取的地图数据,从而...

    面向对象思考
  • 自学HarmonyOS应用开发(62)- 使用对象关系映射数据库保存设定信息

    除了地图数据,秒表应用还有一些其他希望保存的数据,例如上次定位的位置,地图画面的缩放比例等。本文介绍通过对象关系映射数据库技术保存这些信息的方法。

    面向对象思考
  • HarmonyOS 生态,投入还是继续观望?

    HarmonyOS 2.0 从首次亮相至今快满一年,回顾过去一年里的关键节点:2020 年 9 月在华为开发者大会上,HarmonyOS 2.0 首次亮相;20...

    深度学习与Python
  • 配置鸿蒙Windows烧录环境 && 用Hiburn烧录第一个程序

    如果已安装Visual Studio Code,打开命令行工具,输入code --version命令,检查版本号是否为1.45.1及以上版本;可以正常返回版本号...

    跋扈洋
  • HarmonyOS简介

    前两天,华为发布了HarmonyOS 2.0,俺也赶个时髦,给大家简单介绍下HarmonyOS。

    xiangzhihong
  • 【第22期】HarmonyOS应用开发(基础篇)

    这不就是说,以后华为手机都是鸿蒙系统了嘛?鸿蒙还发出了一条视频,视频中显示2021年6月2号将开启鸿蒙操作系统及华为全场景新品发布会。预计现在支持EMUI11升...

    siberiawolf
  • 技术分析 | HarmonyOS到底是不是Android套皮?

    最近鸿蒙系统关注度好高,支持与反对、看好和看衰、「自主的全场景分布式系统」和「Android套壳」各执一词,吵的不可开交。

    刘盼
  • 华为鸿蒙生态的目标:市占率16%以上,跨过生死线

    9 月 10 日,华为正式推出 鸿蒙 OS 2.0 版本(HarmonyOS 2.0),并宣布将 Harmony OS 的代码捐赠给开放原子开源基金会进行开源孵...

    深度学习与Python
  • HarmonyOS与Android的全面对比

    第二是我个人非常看好鸿蒙系统的未来,清楚明白华为和一些民族企业担负的责任和国人的期待,虽然带着一些民族感情;鸿蒙刚发布的时候自己是非常激动的,但是后来项目太忙一...

    肉眼品世界
  • 十问华为HarmonyOS:开源一个月,开发者生态建设进度如何?

    基础软件的开源面临着非常大的挑战,除了技术研发困难重重,开源生态和社区的建设更是难上加难。9 月 10 日,在华为开发者大会 2020 上,华为消费者业务 CE...

    深度学习与Python
  • 程序员看华为HarmonyOS首发

    HarmonyOS代码正式开源,9月10日下午朋友圈散布着这条消息,科技圈炸锅了。各种声音的都有,我也挺好奇的,目前Android、iOS一统江湖,Harmon...

    马上就说
  • 《鸿蒙理论知识04》HarmonyOS概述之系统定义

    【摘要】 系统定位 HarmonyOS 是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体 娱乐等)的分布式操作系统。在传统的单设备系统能力的基...

    玖柒的小窝
  • HarmonyOS-对Android开发者也太友好了吧

    2020年9月10日,华为消费者业务软件部总裁王成录又一次站在了松山湖华为开发者大会的主舞台上。今年,他带来了万众瞩目的华为鸿蒙HarmonyOS2.0...

    Android扫地僧
  • 深圳Java技术培训:MyBatis之基本使用

    本章我们将开始学习一个非常优秀的ORM(对象关系映射)框架:MyBatis,它是目前企业中使用最多的数据库框架。

    深圳java培训技术
  • Hibernate学习笔记1

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hi...

    Java学习
  • 鸿蒙(HarmonyOS)API的源代码去哪了?竟然全抛出异常,原来使用的是虚拟API!

    不管是鸿蒙(HarmonyOS),或是Android、还是其他系统。理解其工作原理最好的方式就是阅读源代码。不过HarmonyOS的所有系统类,跟踪进去,全部是...

    蒙娜丽宁
  • 快速学习-Mybatis 注解开发

    这几年来注解开发越来越流行,Mybatis 也可以使用注解开发方式,这样我们就可以减少编写 Mapper 映射文件了。本次我们先围绕一些基本的 CRUD 来学习...

    cwl_java
  • Hibernate学习笔记2

    定义hbm.xml映射文件和pojo类时都需要定义主键,Hibernate中定义的主键类型包括:自然主键和代理主键:

    Java学习
  • 搭建鸿蒙编译环境(VMware+Linux)

    分布式软总线是多种终端设备的统一基座,为设备之间的互联互通提供了统一的分布式通信能力,能够快速发现并连接设备,高效地分发任务和传输数据。分布式软总线示意图见。

    跋扈洋

扫码关注云+社区

领取腾讯云代金券