核心数据和累积的轻量级迁移

Posted

技术标签:

【中文标题】核心数据和累积的轻量级迁移【英文标题】:Core Data and cumulative lightweight migrations 【发布时间】:2012-11-25 19:46:43 【问题描述】:

我已使用轻量级迁移成功地为即将发布的 1.1 版应用程序版本化了我的核心数据模型。我对这种方法的可维护性有疑问。

如果我再次在我的应用程序的 v1.2 中对模型进行版本化,并且用户从 v1.0 更新到 1.2,这两个迁移是否会依次成功应用?也就是说,如果我保留模型的版本,迁移是否会累积?

【问题讨论】:

【参考方案1】:

如果两个迁移都是轻量级的,则无需依次应用这两个迁移。自lightweight migrations can occur on:

简单添加新属性 删除属性 非可选属性变为可选 可选属性变为非可选属性,并定义默认值 价值 重命名实体或属性

在最后一种情况下,您提供商店中使用的名称(“规范名称”)。这是默认情况下的属性名称,因此它最终是在数据模型的第一个版本中调用的任何属性。然后,只要不使用规范名称,您就可以任意更改属性名称。

因此,最终结果是,Core Data 无法确定如何从版本 1 迁移到版本 2 和从版本 2 迁移到版本 3,但不能直接从版本 1 迁移到版本 3。

相反,如果您通过映射模型指定手动映射,那么您要么必须编写代码以累积应用所有手动映射,要么随着数据模型的发展提供 O(n^2) 映射。

【讨论】:

我对轻量级迁移的“推理”部分感到紧张 - 我可以验证核心数据能够正确推断 1.0->1.1 映射,然后是 1.1->1.2 映射,但确实如此这必然意味着如果映射不是按顺序执行的,它将能够推断出 1.0->1.2 映射?您似乎在说它总是能够正确推断出这一点 - 只是想确保。 我对文档的阅读肯定是应该的。假设您的商店是 SQL,Apple 试图告诉您的是,自动迁移可以发现任何只是添加或删除列或表的东西(并将直接在现有商店上执行这些操作)。如果您保留规范名称并且其他属性只是内部簿记,则重命名实体不会更改列名称。因此,如果后备存储是 SQL,您通常可以确信两个版本之间的区别只是表和列的添加或删除。 如果您在 v1.1 中删除一个属性,然后在 v1.2 中重新添加它,核心数据不会从 v1.0 -> v1.2 触及它,因此您可能会有一些意外数据;)

以上是关于核心数据和累积的轻量级迁移的主要内容,如果未能解决你的问题,请参考以下文章

轻量级核心数据迁移后崩溃

在 NSPersistentDocument 上启用核心数据的自动轻量级迁移

核心数据模型迁移

轻量级迁移核心数据

iOS 核心数据轻量级迁移

核心数据轻量级迁移属性重命名