【问题标题】:Realm model migration strategy领域模型迁移策略
【发布时间】:2015-07-12 10:10:28
【问题描述】:

我在使用领域迁移块和迁移领域的策略时遇到了问题。

给定一个具有多个属性的对象 MyObject:

  • 在版本 1 中,我们有属性 myProperty
  • 在版本 2 中,我们将属性更改为 myPropertyMk2
  • 在版本 3 中,我们将属性更改为 myPropertyMk3

鉴于以下迁移块:

    private class func getMigrationBlock(realmPath: String) -> RLMMigrationBlock {
    return { migration, oldSchemaVersion in
        if (oldSchemaVersion == RLMNotVersioned) {
            NSLog("No database found when migrating.")
            return
        } else {
            NSLog("Migrating \(realmPath) from version \(oldSchemaVersion) to \(RealmMigrationHelper.CURRENT_DATABASE_VERSION)")
        }

        NSLog("Upgrading MyObject from version %d to %d", oldSchemaVersion, CURRENT_DATABASE_VERSION)
        if (oldSchemaVersion < 2) {
            migration.enumerateObjects(MyObject.className(), block: {
                oldObject, newObject in
                newObject["myPropertyMk2"] = oldObject["myProperty"]
            })
        } 
        if (oldSchemaVersion < 3) {
            migration.enumerateObjects(MyObject.className(), block: {
                oldObject, newObject in
                newObject["myPropertyMk3"] = oldObject["myPropertyMk2"]
            })
        } 
        NSLog("Migration complete.")
    }
}

当我是数据库的第 2 版时,它工作得很好(显然没有 oldSchemaVersion 块),但是当我引入第 3 版时,我开始遇到问题,因为它无法识别 oldSchemaVersion 块中的strong>newObject["myPropertyMk2"]。如果我将其更改为 newObject["myPropertyMk3"] 就可以了。

通过阅读 RLMMigration 代码,这非常有意义,因为我们使用旧的 schme 和新的方案,但基于 realm.io 上的文档,我认为这没有意义。那么我会期望它会少一些。

我有一个想法,即通过简单地使用字典,然后最终将此字典应用于 newObject,从而减少块内的方案迁移。

对于处理这个问题的领域迁移策略有什么想法吗?在领域网站上提到过,但只是非常简短。

谢谢你:)

【问题讨论】:

    标签: realm


    【解决方案1】:

    感谢您提出问题并报告问题。

    通过阅读 RLMMigration 代码,这非常有意义,因为我们使用旧的 schme 和新的方案,但基于 realm.io 上的文档,我认为这没有意义。那么我会期望它会少一些。

    正如您从 RLMMigration 中的代码中正确识别的那样,迁移不是无方案的。您提供的迁移闭包应该能够处理从过去的任何版本到当前版本的迁移。如果您的用户没有在两者之间更新您的应用程序并因此跳过了一个版本,那么 Realm 就不可能知道您的中间架构版本,因为架构会在运行时反映。您通常可以故意破坏与现有旧版本的向后兼容性,但您需要注意将配置重置为定义的状态。

    您的观点肯定是正确的,这可以得到更好的记录。我已经为此创建了一个内部票证。

    我有一个想法,即通过简单地使用字典,然后最终将此字典应用于 newObject,从而减少块内的方案迁移。

    对于处理这个问题的领域迁移策略有什么想法吗?在领域网站上提到过,但只是非常简短。

    根据您的方案和您拥有的数据量,您可以通过字典在内存中按对象重新组织它,然后按照您的描述将其应用于 newObject。当前的 API 做出的假设相对较少,并允许使用这样的方法。但它不会以这种方式对每个人都有好处,例如如果您有大量相关对象。

    【讨论】:

    • 谢谢@marius - 这有点出乎我的意料,但希望有一个不同的答案:) 我不确定哪种方法是进行这种数据迁移的更好方法。现在我已经通过从每个特定对象版本迁移到这个给定对象类型的当前版本解决了这个问题,因为在这种情况下它实际上是有意义的。也许像这样的伪代码:migration.enumerateObjects(ChatMessageDao.className(), block: { oldObject, newObject in let myTempDictionary = oldObject 的内容 transformValues(myTempDictionary) newObject = myTempDictionary 的内容}
    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多