iOS8.1 Core-数据轻量级+重量级迁移

Posted

技术标签:

【中文标题】iOS8.1 Core-数据轻量级+重量级迁移【英文标题】:iOS8.1 Core-Data Lightweight + Heavyweight Migration 【发布时间】:2014-11-19 17:26:03 【问题描述】:

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

我对模型进行了一些更改,制作了 V2。这涉及创建一个具有 type 属性以及其他一些属性的新实体。 type 属性是到 plate 实体的链接。

我的应用程序的新版本发布并且数据迁移正常,因为这是轻量级的。由于当时我自己的原因,我当时没有建立关系。

稍后我决定对结构做一些更大的改变,创建新的实体 FixtureTypePlateTypeImage。然后我创建一些关系。这给了我模型的 V3。

由于这种修改的性质,我需要进行从 V2 到 V3 的重量级迁移,其中包括复制属性数据、填充新属性和设置关系。因此,我建立了一个映射模型,创建了我必要的迁移策略并点击了开始按钮。

这适用于 V2 到 V3,但是在测试从 V1 到 V3 的迁移时,我遇到了一系列错误...,例如

reason=无法就地迁移存储:验证错误缺少强制目标关系上的属性值

我正在使用以下 PSC 选项:

NSDictionary *options = @
                          NSMigratePersistentStoresAutomaticallyOption : @YES,
                          NSInferMappingModelAutomaticallyOption : @YES
                          ;


if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 

那么,我的问题是 core-data 如何迁移数据?是按顺序进行的,所以我得到了从 V1 到 V2 的轻量级迁移,然后是重量级 V2 到 V3 的迁移,还是从 V1 到 V3 的迁移?如果是这样,我是否需要为 V1 到 V3 创建迁移策略(让事情变得非常笨拙以非常快速地涵盖每个组合)?

另外,一旦我开始使用重量级,我现在是否失去了轻量级迁移工具?

感谢您的建议和建议。

【问题讨论】:

【参考方案1】:

Core Data 版本控制不是临时的。它只知道来源和目的地。因此,一旦引入新模型,您就需要从所有以前的模型到当前模型进行测试。

如果你添加V4,那么你需要测试:

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

因此,如果您的 V4 需要大量迁移,那么您需要为每个可能的迁移制作地图。

我的一般建议是不惜一切代价避免大量迁移。它们不是为在 ios 上工作而设计的,并且经常导致问题。有些替代品会表现更好。

更好的方法

我用来代替大量迁移的两种最常见的方法是

    导出/导入。我为此使用 JSON。它更容易占用内存,因此可以避免由于内存限制而导致的崩溃。

    聪明的迁移前后代码。例如,如果您要将数据拆分到一个新对象,这需要大量迁移,您可以创建新对象并将数据保留在旧对象中。这将把它变成一个轻量级的迁移。从那里您可以观察迁移,然后在迁移完成后手动移动数据。您甚至可以再进行一次轻量级迁移到不包含即将删除的属性的最终模型。

请记住,iCloud 不允许大量迁移,因此如果您打算考虑使用 iCloud,则必须跳过大量迁移。这也是一个非常强烈的迹象,表明 Apple 正在放慢弃用大量迁移并将其作为“最后手段”的策略。

【讨论】:

谢谢。那么你是说一旦某个版本(例如 V2-V3)关闭了轻量级,那么它就必须始终关闭,我需要回顾性地生成重量级迁移? ...另外,还有哪些性能更​​好的替代品? 你永远不需要“关闭它”,因为 Core Data 将使用映射模型而不是尝试进行自动迁移。其次,如果某个理论上的未来版本在轻量级迁移下是可行的,即使以前的版本需要大量迁移,也可以这样做。这意味着必须单独测试每种情况。 感谢您提供有用的答案。这帮助我避免了通过使用大量迁移(并更好地理解它)来避免犯大错误,尤其是当我考虑在未来将 iCloud 与我的数据一起使用时。 替代方案...用于大量迁移!我不知道为什么我还买了你的书

以上是关于iOS8.1 Core-数据轻量级+重量级迁移的主要内容,如果未能解决你的问题,请参考以下文章

Core Data轻量级迁移错误

Core Data轻量级迁移有多少个迁移步骤?

Core Data(iPhone)实现“自动轻量级迁移”

轻量级迁移后如何从 Core Data 中删除数据

Core Data 轻量级迁移后执行自定义代码

Core Data 和 Restkit 简单轻量级迁移错误