- 使用临时表方案,在升级时将旧表重命名为临时表,并创建一张与旧表未重命名前的名字相同的新表,分批次取出临时表中数据进行转换存入新表中,数据迁移完毕后删除临时表。源码参考DataService.ets。
// 开启事务
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);
- 为方便扩展迭代,在父类中定义整体逻辑,子类只需继承父类,重写字段转换逻辑即可。源码参考DataService.ets。
/**
* TODO: 知识点: 新老版本字段转换逻辑(版本升级只需要实现这个方法即可)
* @param resultSet 查询结果集
* @param targetVersion 目标版本
* @returns 目标版本格式数据
*/
abstract transform(resultSet: relationalStore.ResultSet, targetVersion: number): ValuesBucket;
- 根据数据库当前版本和需升级至版本,选择对应的升级逻辑。源码参考DatabaseUpgrade.ets。
switch (currentVersion) {
case Constants.V1:
await this.v1DataService.onUpgrade(version);
break;
case Constants.V2:
a