核心数据从整数16迁移到可转换

时间:2015-10-19 16:02:08

标签: ios core-data

在我的应用程序中,我有一个具有属性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?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

对于如何将现有的整数值转换为二进制blob没有明显的规则,因此Core Data在这里引发了它并且说它不知道你想要它到底是什么做。将属性转换为不同的数据类型需要您做更多的工作。

如果你实际上在转换数据 - 就像在,你希望新的二进制文件value以某种方式从旧的整数value派生 - 那么你需要创建一个映射模型并进行迁移相对较难的方式。部分内容涉及您进行整数到二进制的转换。这里需要了解很多,所以我会将您推荐给Apple's Core Data migration guide以获取更多信息。

如果新二进制文件value独立于旧整数value - 意味着新数据未派生旧的数据,但它是一个完整的替代品 - 你可以保持简单。如果是这种情况,请不要重命名该属性。使用其他名称valueBlob或其他名称创建新属性,然后删除value属性。自动轻量级迁移可以处理添加和删除属性,因此它可以处理该更改。