我拥有核心数据库的第1版。 (简化示例)
我对模型进行了一些更改,制作了V2。这涉及使用类型属性以及其他一些属性创建新实体。 type 属性是 plate 实体的链接。
我的应用程序的新版本已发布,数据迁移正常,因为它是轻量级的。出于我自己的原因,我此时没有建立关系。
稍后我决定对结构进行一些更大的更改,创建新实体 FixtureType 和 PlateTypeImage 。然后我创建了一些关系。这给了我模特的V3。
由于这种修改的性质,我需要进行从V2到V3的重量级迁移,包括复制属性数据,填充新属性以及设置关系。因此,我设置了一个映射模型,创建了必要的迁移策略并点击了go按钮。
这适用于V2到V3,但在测试从V1到V3的迁移时,我收到一系列错误......,例如
reason =无法就地迁移存储:验证错误缺少必填目标关系的属性值
我使用以下PSC选项:
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES
};
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
那么,我的查询是核心数据如何迁移数据?它是顺序的,所以我从V1到V2轻量级迁移,然后重量级V2到V3,还是从V1迁移到V3?如果是这样,我是否需要为V1到V3创建迁移策略(让事情变得笨拙,以涵盖所有组合)?
另外,一旦我开始使用重量级,我现在已经失去了轻量级迁移工具吗?
建议和意见表示赞赏。
答案 0 :(得分:5)
核心数据版本控制不是暂时的。它只知道来源和目的地。因此,只要您引入新模型,就需要从之前的所有模型到当前模型进行测试。
如果添加V4,则需要测试:
V1-> V4
V2-> V4
V3-> V4
因此,如果您的V4需要大量迁移,那么您需要为每次可能的迁移做一个地图。
我的一般建议是不惜一切代价避免大量迁移。它们不适用于iOS,并且经常导致问题。有些替代方案会表现得更好。
我使用的两种最常用的方法是
导出/导入。我为此使用JSON。它在内存上更容易,因此可以避免由于内存限制而导致的崩溃。
聪明的迁移前后代码。例如,如果要将数据拆分为新对象(需要大量迁移的对象),则可以创建新对象并将数据保留在旧对象中。这会将其转变为轻量级迁移。从那里,您可以观察迁移,然后在迁移完成后手动移动数据。您甚至可以再次轻量迁移到最终模型,该模型不包含即将被删除的属性。
请记住,iCloud不允许大量迁移,所以如果您打算考虑使用iCloud,那么您必须跳过大量迁移。这也是一个非常强有力的指标,表明苹果正在放慢对大量迁移的贬值,并将其作为“最后手段”的策略留在原地。