当前位置: 首页 > article >正文

鸿蒙5.0实战案例:数据库版本升级案例

往期推文全新看点(文中附带全新鸿蒙5.0全栈学习笔录)

✏️ 鸿蒙(HarmonyOS)北向开发知识点记录~

✏️ 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~

✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?

✏️ 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

✏️ 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

✏️ 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

✏️ 记录一场鸿蒙开发岗位面试经历~

✏️ 持续更新中……


本示例介绍使用关系型数据库的接口来进行数据库升降级场景实现

效果预览图

使用说明

1. 加载完成后有版本升级以及版本恢复两种按钮

2. 点击版本升级下的”升级至V2“按钮,则数据库版本会从V1升级至V2,且在表格处显示V1和V2版本表格字段对比。

3. 点击版本升级下的”升级至V3“按钮,若当前是V1版本,则会执行V1升级至V3的逻辑,且在表格处显示V1和V3版本表格字段对比。

4. 版本恢复下的按钮会在升级至V1以上版本时可点击,如步骤二中升级至V2版本后,则”恢复到V1“按钮可点击,点击后数据库版本回退至V1版本

实现思路

数据库版本升级有两种方案

方案一:直接升级,需要实现各版本到目标版本的实现逻辑,优点在于性能好,缺点是逻辑复杂且较难维护。

方案二:一步一步升级到最新版本,只需要实现紧邻版本的升级逻辑,优点在于逻辑简单,便于维护,缺点在于比方案一性能差。

在本示例中两种方案都有体现,其中从V1->V2->V3用的方案二,从V1->V3使用的方案一,具体实现步骤如下:

1.使用临时表方案,在升级时将旧表重命名为临时表,并创建一张与旧表未重命名前的名字相同的新表,分批次取出临时表中数据进行转换存入新表中,数据迁移完毕后删除临时表。

// 开启事务

dbUtils.beginTransaction();

// 获取当前数据库版本

const oldVersion: number = dbUtils.getStoreVersion();

// 将旧表改为临时表

await dbUtils.updateTableName(Constants.STUDENT_TABLE, Constants.STUDENT_TABLE + oldVersion);

// 创建新表

const newTableColumnTypeMap: string[][] = CommonUtils.getTableColumnTypeMapByVersion(targetVersion);

await dbUtils.createTable(Constants.STUDENT_TABLE, newTableColumnTypeMap);

dbUtils.commit();

// 自定义迁移逻辑

let lastId: number = -1;

let flag: boolean = false;

await this.migrate(lastId, oldVersion, targetVersion, flag);

// 删除旧表

await dbUtils.dropTable(Constants.STUDENT_TABLE + oldVersion, targetVersion);

2.为方便扩展迭代,在父类中定义整体逻辑,子类只需继承父类,重写字段转换逻辑即可。

/**

 * TODO: 知识点: 新老版本字段转换逻辑(版本升级只需要实现这个方法即可)

 * @param resultSet 查询结果集

 * @param targetVersion 目标版本

 * @returns 目标版本格式数据

 */

abstract transform(resultSet: relationalStore.ResultSet, targetVersion: number): ValuesBucket;

3.根据数据库当前版本和需升级至版本,选择对应的升级逻辑

switch (currentVersion) {

    case Constants.V1:

        await this.v1DataService.onUpgrade(version);

        break;

    case Constants.V2:

        await this.v2DataService.onUpgrade(version);

        break;

    default:

        throw new Error('The database version to which you need to upgrade is incorrect');

}

工程结构&模块类型

databaseupgrade                                       // har类型

    |---components

    |   |---CustomFormComponents.ets                       // 自定义表格组件          

    |---constants

    |   |---Constants.ets                                 // 常量类

    |---service

    |   |---DataService.ets                               // 业务层-版本升级逻辑

    |---utils

    |   |---CommonUtils.ets                               // 工具类

    |   |---DBUtils.ets                                   // 数据库操作封装

    |---view

    |   |---DatabaseUpgrade.ets                           // 视图层-数据库版本升级案例交互界面

http://www.kler.cn/a/550182.html

相关文章:

  • Tomcat如何处理Http请求
  • AI大模型时代的“瘦身”革命:模型压缩与加速技术全解析
  • 【达梦数据库】disql工具参数绑定
  • deepseek和ChatGPT 4o比较
  • Springboot集成Spring AI和Milvus,验证RAG构建过程
  • Postgresql在线重建索引REINDEX INDEX CONCURRENTLY出现后缀带_ccnew和_ccold关键字且状态是invaild的索引
  • 【撰写技巧】基金项目撰写跟踪交流会
  • 一种动态地址的查询
  • 2.17学习,双向循环链表
  • BFS广度优先搜索——994.腐烂的橘子
  • 通过VSCode直接连接使用 GPT的编程助手
  • 以下是 HTML 与 HTML5 的核心区别及从基础到高级的总结:
  • window中git bash使用conda命令
  • 什么是3D视觉无序抓取?
  • 海康摄像头IPV6模式,手动,自动,路由公告
  • 【力扣Hot 100】回溯1
  • Maven 项⽬⽣命周期
  • 数字化转型实战:Odoo+工业物联网技术破解江苏食品制造行业三大核心痛点
  • Java 运行时常量池笔记(详细版
  • 基础算法# 求一个数的二进制表示当中有几个1 (C++)