如何处理iOS上的Realm React Native迁移和schemaVersion?

5

在我开始使用Realm React Native和iOS之前,我正在试着学习更多有关如何处理迁移的知识。以下声明让我感到担忧:

Realm React Native 0.10.0

目前仅支持更新模式和schemaVersion来处理迁移,具体请参考上述内容。暂不支持数据迁移,但未来可能会添加该功能。

我理解这意味着我需要每次对**任何模式**进行更改时都要增加schemaVersion。

我如何指定多个模式,每个模式都有自己的schema版本?

这样做是行不通的:

export default new Realm(
  {schema: [AppSetting], schemaVersion: 0},
  {schema: [Gps], schemaVersion: 3},
  {schema: [Waypoint], schemaVersion: 4},
  {schema: [FlightPath], schemaVersion: 1},
);

这假设我的更复杂的模式可能需要频繁修订,直到我把事情搞对为止。
只要我只添加新属性,迁移就会简单吗?
我假设我不能重命名或删除现有属性?
非常感谢关于领域迁移的建议,
1个回答

8

您需要为整个模式指定一个单一的schemaVersion:

export default new Realm({schema: [AppSetting, Gps, ...], schemaVersion: 0});

当您在模式中更新任何objectSchema时,您需要提高模式版本。这意味着一些个别的objectSchema将在多个schemaVersions之间保持不变,但我认为这比每个对象类型都有不同的版本要简单得多。
当您使用新的schemaVersion / schema初始化Realm时,所有新属性都会添加并且缺少的属性已删除。因此,如果您重命名属性,则将添加一个具有新名称的新属性,并删除旧属性以及其数据。现在,如果您想将数据从一个属性复制到另一个属性,则需要分两步进行,因此旧属性和新属性同时存在,允许您进行复制。您还需要跟踪是否已进行了复制,以便仅在使用新模式首次打开Realm时执行此操作。如果您只添加属性,则可以避免大部分(如果不是全部)的这种复杂性。
我们没有时间完成初始发布的迁移工作,但好消息是大部分功能在内部实现,只需要通过js api公开即可。工作方式如下:当打开Realm时,您将能够传递迁移函数,从而让您访问预先和后续迁移的Realms,使您能够根据需要复制数据。我们希望在接下来的几个版本中完成此工作。

@Ari,如何让旧数据和新数据同时存在,以便我可以将数据复制到新格式?假设我重命名了一个属性,我需要将旧数据复制到新数据中,我该怎么做?当我第一次使用新的schemaVersion运行时,旧属性名称会在我有机会复制到新名称的属性之前被删除吗? - Ed of the Mountain
@Ari 我原以为在添加新属性时不需要进行迁移,这不正确吗?所有对象的schemaVersion字段都设置为0,并为新的schemaVersion递增到1。我得到了一个红色框错误提示,说因为我向对象模型中添加了新属性,所以需要进行迁移?我错过了什么吗? - Ed of the Mountain
export default new Realm({schema: [ AppSetting, Waypoint, Boreplan, ]}); - Ed of the Mountain
没关系,不指定schemaVersion会默认为0。当只添加新属性时,指定模式版本可以在不需要迁移的情况下工作。export default new Realm({ schema: [ AppSetting, Waypoint, Boreplan, ], schemaVersion: 1 }); - Ed of the Mountain
1
只是想让您知道,最新版本的 Realm 支持数据迁移,因此您可以通过单个模式更改重命名属性,并且可以在迁移函数中复制属性值。https://realm.io/docs/react-native/latest/#migrations - Ari
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接