2015-10-19 133 views
2

在我的應用程序中,我有一個核心數據實體,其屬性爲value。我想在即將發佈的版本中將此屬性的類型從Integer 16更改爲Transformable核心數據從整數16遷移到可轉換

現在,建立我的持久存儲協調的時候,我包括以下內容的選項:我已經建立了我的核心數據模型的第二個版本,其中包括更新到value屬性

let options: [NSString: Bool] = [ 
      NSMigratePersistentStoresAutomaticallyOption: true, 
      NSInferMappingModelAutomaticallyOption: true] 

try coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options) ... 

現在,並沒有其他變化。當我學嘗試構建,我得到以下錯誤:

CoreData: error: -addPersistentStoreWithType:SQLite ... Persistent store migration failed, missing mapping model 

進一步回落,這一點:

Can't find or automatically infer mapping model for migration ... Source and destination attribute types are incompatible. 

因此很明顯,CoreData不能從整數16映射到自動變形?我該如何解決這個問題?

回答

0

對於如何將現有的整數值轉換爲二進制blob沒有明顯的規則,所以Core Data拋出了它的手,並表示它不知道你想要它做什麼。將屬性轉換爲其他數據類型需要您做更多工作。

如果你實際上是在轉換數據 - ,你希望新的二進制value從舊的整數value以某種方式得到的 - 那麼你需要創建一個映射模型,做遷移相對艱辛的道路。其中的一部分將涉及到進行整數到二進制轉換。這裏有很多需要了解的信息,所以我會告訴你Apple's Core Data migration guide瞭解更多信息。

然而如果新的二進制value獨立於老整數value的 - 這意味着新的數據不是來源於舊數據,但對於它 - 一個完全替代,你可以讓事情變得簡單。如果是這種情況,請不要重命名屬性。創建一個不同名稱的新屬性,valueBlob或其他,並刪除value屬性。自動輕量級遷移可以處理添加和刪除屬性,因此它可以處理該更改。

+0

您還可以按順序鏈接多個輕量級遷移,以執行更復雜的遷移,而無需通過重量級路徑。在這種情況下,您可以執行Tom在第二部分中提出的建議,並創建使用整數值中的數據的第二個屬性,並刪除整數值屬性。然後,您可以進行後續輕量級遷移,將valueBlob屬性重命名爲value。這對於這個特定的例子來說可能是過分的,但對於避免重量級遷移路徑可能是有用的。 –