HarmonyOS鸿蒙Next中应用使用relationalStore创建了库和表,并且表中已有数据,新需求需要给表添加字段,怎样做比较简单易行?

HarmonyOS鸿蒙Next中应用使用relationalStore创建了库和表,并且表中已有数据,新需求需要给表添加字段,怎样做比较简单易行?

6 回复

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

具体参考:数据库版本升级案例

更多关于HarmonyOS鸿蒙Next中应用使用relationalStore创建了库和表,并且表中已有数据,新需求需要给表添加字段,怎样做比较简单易行?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


通过executeSql方法执行ALTER TABLE语句添加字段:

// 获取已创建的RdbStore对象后
store.executeSql(
    "ALTER TABLE your_table_name ADD COLUMN new_column_name TEXT", 
    [], 
    (err: BusinessError) => {
        if (err) {
            console.error(`添加字段失败: ${err.code}, ${err.message}`);
        } else {
            console.info("字段添加成功");
        }
    }
);

创建/打开数据库时,提升 version,并在 onUpgrade 中执行一条 DDL

import {getTypeManager, StoreConfig} from '@ohos.data.relationalStore';

// 1)把 version 从 1 调到 2
const storeConfig: StoreConfig = {
  name: 'mydb.db',
  version: 2,
  tables: [
    {
      name: 'user',
      // 旧 schema + 新字段 newCol
      columns: {
        id: 'INTEGER PRIMARY KEY AUTOINCREMENT',
        name: 'TEXT NOT NULL',
        newCol: 'TEXT',      // 新加的字段
      }
    }
  ],
  onUpgrade: (db, oldVersion, newVersion) => {
    if (oldVersion < 2) {
      // 2)执行 ALTER TABLE
      db.executeSql(`ALTER TABLE user ADD COLUMN newCol TEXT DEFAULT ''`);
    }
  }
};

// 打开即可触发 onUpgrade
const store = getTypeManager('database', storeConfig);
store.openOrCreate().then(db => {
  console.info('升级成功');
}).catch(err => {
  console.error('升级失败', err);
});

做个数据迁移功能,检测如果是旧版本或者表中没有该字段,则执行数据库DDL命令添加字段,这样不影响旧数据。

在HarmonyOS鸿蒙Next中,使用relationalStore给已有数据的表添加字段,可通过ALTER TABLE语句实现。具体操作为:在数据库升级回调onUpgrade中执行"ALTER TABLE 表名 ADD COLUMN 新字段名 数据类型"语句。注意需维护数据库版本号递增,系统会自动触发升级流程。此操作不会影响原有数据,新字段值为NULL或默认值。

在HarmonyOS Next中,使用relationalStore为已有数据的表添加新字段,可以通过以下步骤实现:

  1. 使用ALTER TABLE语句修改表结构:
await store.executeSql('ALTER TABLE 表名 ADD COLUMN 新字段名 字段类型');
  1. 完整示例代码:
import relationalStore from '@ohos.data.relationalStore';

// 获取已有RdbStore实例
let store = await relationalStore.getRdbStore(context, {
  name: '数据库名.db'
});

try {
  // 添加新字段
  await store.executeSql('ALTER TABLE 表名 ADD COLUMN 新字段名 TEXT'); // TEXT可替换为其他类型
  console.log('表结构更新成功');
} catch (err) {
  console.error(`更新表结构失败: ${err}`);
}

注意事项:

  1. 新添加的字段对于已有记录会默认填充NULL值
  2. 如需设置默认值,可在语句中添加DEFAULT约束
  3. 支持添加的字段类型包括:INTEGER、TEXT、REAL、BLOB等
  4. 此操作不会影响表中已有数据

这种方法直接通过SQL语句修改表结构,是最简单高效的方案。

回到顶部