2017-02-15 74 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