iOS8.1核心数据轻量级+重量级迁移

Fit*_*rst 2 macos core-data core-data-migration ios

我有我的核心数据库的第1版.(简化示例)

在此输入图像描述

我对模型进行了一些更改,制作了V2.这涉及创建具有type属性加上其他一些的新实体.该类型属性是链接到该的实体. 在此输入图像描述

我的应用程序的新版本已发布,数据迁移正常,因为它是轻量级的.出于我自己的原因,我此时没有建立关系.

一段时间后,我决定对结构做一些更大的改动,创建新的实体FixtureTypePlateTypeImage.然后我创建了一些关系.这给了我模特的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]) {
Run Code Online (Sandbox Code Playgroud)

那么,我的查询是核心数据如何迁移数据?它是顺序的,所以我从V1到V2轻量级迁移,然后重量级V2到V3,还是从V1迁移到V3?如果是这样,我是否需要为V1到V3创建迁移策略(让事情变得笨拙以便涵盖所有组合)?

此外,一旦我开始使用重量级,我现在失去了轻量级迁移设施吗?

建议和意见表示赞赏.

Mar*_*rra 5

核心数据版本控制不是暂时的.它只知道来源和目的地.因此,只要您引入新模型,就需要从之前的所有模型到当前模型进行测试.

如果添加V4,则需要测试:

V1-> V4
V2-> V4
V3-> V4

因此,如果您的V4需要大量迁移,那么您需要为每个可能的迁移执行映射.

我的一般建议是不惜一切代价避免大规模迁移.它们不适用于iOS,并且经常导致问题.有些替代方案会表现得更好.

更好的方法

我使用两种最常用的方法而不是重度迁移

  1. 进出口.我为此使用JSON.它在内存上更容易,因此可以避免由于内存限制而导致的崩溃.

  2. 聪明的迁移前和迁移后代码.例如,如果要将数据拆分为新对象(需要大量迁移的对象),则可以创建新对象并将数据保留在旧对象中.这会将其转变为轻量级迁移.从那里,您可以观察迁移,然后在迁移完成后手动移动数据.您甚至可以再次轻量迁移到最终模型,该模型不包含即将被删除的属性.

请记住,iCloud不允许大量迁移,所以如果您打算考虑使用iCloud,那么您必须跳过大量迁移.这也是一个非常强有力的指标,表明苹果正在放慢对大量移民的贬值,并将其作为"最后手段"的策略留在原地.