2015-10-19 137 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。这对于这个特定的例子来说可能是过分的,但对于避免重量级迁移路径可能是有用的。 –