领域版本迁移重命名属性不存在

时间:2017-02-15 14:12:55

标签: ios swift migration realm version

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

下面是我的情况错误情景

第一

我有一个简单的<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script> schemeVersion 0模型(默认)

User

在版本1中添加date2

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

并迁移

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

并在版本3中添加date3,并在版本4中将date3重命名为日期4

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
                })
            }
}

并迁移

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

当我顺序迁移时0 - &gt; 1 - &gt; 2 - &gt; 3 - &gt; 4工作正常

但从0版本迁移到4版本会导致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") } }

fatal error: 'try!' expression unexpectedly raised an error

在这种情况下如何将0~3版本迁移到4而不存在以上不存在的exeption?

2 个答案:

答案 0 :(得分:2)

如果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一次。您不需要每次都获取所有对象。我希望它能奏效!

答案 1 :(得分:0)

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