在我的应用程序中,我有一个具有属性value
的核心数据实体。我想在即将发布的版本中将此属性的类型从Integer 16
更改为Transformable
。
现在,在设置持久性商店协调员时,我将以下选项包括在内:
let options: [NSString: Bool] = [
NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true]
try coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options) ...
现在,我已经创建了我的核心数据模型的第二个版本,其中包含value
属性的更新,而没有其他更改。当我尝试构建时,我收到以下错误:
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无法自动从Integer 16映射到Transformable?我该如何解决这个问题?
答案 0 :(得分:0)
对于如何将现有的整数值转换为二进制blob没有明显的规则,因此Core Data在这里引发了它并且说它不知道你想要它到底是什么做。将属性转换为不同的数据类型需要您做更多的工作。
如果你实际上在转换数据 - 就像在,你希望新的二进制文件value
以某种方式从旧的整数value
派生 - 那么你需要创建一个映射模型并进行迁移相对较难的方式。部分内容涉及您进行整数到二进制的转换。这里需要了解很多,所以我会将您推荐给Apple's Core Data migration guide以获取更多信息。
但如果新二进制文件value
独立于旧整数value
- 意味着新数据未派生旧的数据,但它是一个完整的替代品 - 你可以保持简单。如果是这种情况,请不要重命名该属性。使用其他名称valueBlob
或其他名称创建新属性,然后删除value
属性。自动轻量级迁移可以处理添加和删除属性,因此它可以处理该更改。