2017-02-15 116 views
1

您好我有境界的迁移,但有满足错误境界版本迁移重命名属性不存在

下面

是我的情况的错误情景

第一

我schemeVersion 0的简单User模式(默认)在版本

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

添加日期2 1

class User: Object { 
    dynamic var username = "" 
    dynmaic 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

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

DATE3重命名为日期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") 
      } 
} 

当我sequencely迁移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而不上述不存在exeption

回答

2

如果schemaVersion 3只有一个,就是有“DATE3”,第3版需要单独处理(我不知道schemaVersion 2发生什么)。你不能插入的OLDobject [“日期2”]来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一次。您不需要每次都获取所有对象。我希望它能起作用!

+0

它节省我的时间谢谢:) – Cruz

0

您需要将您的模式的最终版本存在,但因为境界需要这个属性添加到你已经在数据库中(这是移民所做的一切是不是在原来的每个属性迁移 - 它填补了空洞)。你为什么要删除你的代码有效?你得到了DATE3一个例外,因为它不会在模式0存在,你说你要直接去从0到4 ...您可以与所有属性完整定义开始,并重新加载从头开始所有数据没有一个迁移,或者让你的工作代码保持原样。它没有任何问题。问我任何我没有充分解释的事情。

+0

我想另一种选择适合你的:如果你能填充的DB开始,用你当前的数据库(模式4)的副本,你的“0版”,并删除所有迁移代码。并确保你的代码能够在insert(add)上正确填充date3等。 – Mozahler