14-6 RN之更新realm表

87 阅读2分钟

在这一节中,我们学习了如何更新 Realm 数据库中的表结构,以及如何在不破坏已有数据的情况下进行表结构迁移。

1. 为什么需要更新表结构

在开发过程中,表结构的修改是很常见的,比如需要添加新字段、删除旧字段,或者修改已有字段。如果直接修改表结构,原有数据可能会导致异常。特别是在应用已经上线后,直接修改表结构可能会影响到已存储的数据。

2. 更新表结构时如何处理已存数据

当我们新增字段(例如添加 rate 字段)时,需要确保迁移已有数据。比如,数据库中以前没有 rate 字段,我们要计算并为旧数据赋值新的字段。直接修改字段可能会导致应用崩溃。

class Program {
  currentTime = 0;
  duration = 0;
  static schema = {
    name: 'Program',
    primaryKey: 'id',
    properties: {
      id: 'string',
      title: 'string',
      thumbnailUrl: 'string',
      currentTime: {type: 'double', default: 0},
      duration: {type: 'double', default: 0},
      rate: {type: 'double', default: 0},
    },
  };
}

3. 使用版本号和迁移策略

为了处理表结构的更新,Realm 引入了版本号机制。在每次创建 Realm 实例时,指定一个版本号。如果版本号发生变化,Realm 会触发数据迁移的过程。迁移策略通过 migration 属性进行定义,确保数据在迁移时不会丢失或者发生错误。

const realm = new Realm({
  schema: [Program],
  schemaVersion: 1, // 新的版本号
  migration: (oldRealm, newRealm) => {
    if (oldRealm.schemaVersion < 1) {
      const oldObjects = oldRealm.objects('Program');
      const newObjects = newRealm.objects('Program');
      for (let i = 0; i < oldObjects.length; i++) {
        newObjects[i].rate = Math.floor(((oldObjects[i].currentTime * 100) / oldObjects[i].duration) * 100) / 100;
      }
    }
  }
});

在迁移过程中,我们通过 oldRealm 获取到旧版本的数据,通过 newRealm 进行迁移,并为旧数据计算并赋值新字段的值。

4. 迁移完成后查看效果

通过这种迁移方法,即使在应用上线后修改表结构,我们也能保证已有数据能够无缝过渡到新的结构,同时为新数据提供新的字段。

总结

在这一节中,我们学习了如何使用 Realm 的版本号和迁移策略来更新数据库表结构,而不影响已有数据。通过这种方式,我们可以在不清空数据的情况下,修改数据库结构并保持数据一致性。

下一节我们将开始完成 "发现模块" 的功能。