【问题标题】:Realm version Migration renaming property not existed领域版本迁移重命名属性不存在
【发布时间】:2017-07-04 06:04:21
【问题描述】:

您好,我有 Realm 迁移,但遇到错误

下面是我的情况错误场景

第一

我有一个简单的User 模型,schemeVersion 0(默认)

class User: Object {
    dynamic var username = ""
    dynamic var date = NSDate()
}

在版本 1 中添加 date2

class User: Object {
    dynamic var username = ""
    dynamic var date = NSDate()
    dynamic var date2 = NSDate()
}

并迁移

Realm.Configuration.defaultConfiguration = Realm.Configuration(
        schemaVersion: 1,
        migrationBlock: { migration, oldSchemaVersion in
            // We haven’t migrated anything yet, so oldSchemaVersion == 0
            if oldSchemaVersion < 1 {
                migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in
                    newObject!["date2"] = oldObject!["date"] as! NSDate
                })
            }
}

在版本 3 中添加 date3 并在版本 4 中将 date3 重命名为 date 4

class User: Object {
    dynamic var username = ""
    dynamic var date = NSDate()
    dynamic var date2 = NSDate()
    dynamic var date4 = NSDate()
}

并迁移

Realm.Configuration.defaultConfiguration = Realm.Configuration(
        schemaVersion: 4,
        migrationBlock: { migration, oldSchemaVersion in
            // We haven’t migrated anything yet, so oldSchemaVersion == 0
            if oldSchemaVersion < 1 {
                migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in
                    newObject!["date2"] = oldObject!["date"] as! NSDate
                })
            }

            if oldSchemaVersion < 2 {
                migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in
                    newObject!["date3"] = oldObject!["date2"] as! NSDate
                })
            }

            if oldSchemaVersion < 3 {
                migration.renameProperty(onType: User.className(), from: "date3", to: "date4")
            }
}

当我按顺序迁移 0 -> 1 -> 2 -> 3 -> 4 时工作正常

但是当从 0 版本迁移到 4 版本时会导致 fatal error: 'try!' expression unexpectedly raised an error

"Cannot rename property 'User.date3' because it does not exist."

在这种情况下,我如何将 0 ~ 3 版本迁移到 4 而没有上述不存在的例外?

【问题讨论】:

    标签: ios swift migration realm version


    【解决方案1】:

    如果 schemaVersion 3 仅具有“date3”,则必须单独处理版本 3(我不知道 schemaVersion 2 中发生了什么)。而且您不能将 oldObject["date2"] 插入 newObject["date3"],因为 newObject 没有 date3 作为错误。迁移的目的是使旧方案与当前方案相匹配。在你的项目中尝试一下,它对我有用!

     Realm.Configuration.defaultConfiguration = Realm.Configuration(
           schemaVersion: 4, 
           migrationBlock: { migration, oldSchemaVersion in
           migration.enumerateObjects(ofType: User.className(), { (oldObject, newObject) in
               if oldSchemaVersion < 1 {
                   newObject?["date2"] = oldObject!["date"] as! NSDate
               }
               // use newObject["date2"] instead of oldObject["date2"] for schemaVerion 0
               if oldSchemaVersion < 2 {
                   newObject?["date4"] = newObject?["date2"] as! NSDate
               }
          })
          // separate version 3 for "date3"
          if oldSchemaVersion == 3 {
              migration.renameProperty(onType: User.className(), from: "date3", to: "date4")
          }
    })
    

    我建议你使用一次 func enumerateObjects。您不需要每次都获取所有对象。我希望它会起作用!

    【讨论】:

    • 它节省了我的时间谢谢:)
    【解决方案2】:

    您需要为每个属性进行迁移,这些属性将存在于您的架构的最终版本中但不在原始版本中,因为 Realm 需要将此属性添加到您在数据库中已有的所有内容中(这就是迁移所做的 - 它填补漏洞)。为什么要删除有效的代码?您得到 date3 的例外,因为它在模式 0 中不存在,并且您说您想直接从 0 转到 4... 您可以从所有属性的完整定义重新开始,然后从头开始重新加载所有数据迁移,或保留您的工作代码。这没有什么问题。问我任何我没有充分解释的事情。

    【讨论】:

    • 我为您想到了另一个选择:如果您可以从已填充的数据库开始,请使用当前数据库的副本(模式 4)作为“版本 0”并删除所有迁移代码。并确保您有在插入(添加)时正确填充 date3 等的代码。
    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多