未发布的 xcdatamodel 版本和轻量级迁移

Posted

技术标签:

【中文标题】未发布的 xcdatamodel 版本和轻量级迁移【英文标题】:Unreleased xcdatamodel versions and lightweight migration 【发布时间】:2013-08-07 15:22:56 【问题描述】:

如果我在版本 A 和版本 B 之间有多个未发布的 xcdatamodel 版本,如果我删除未发布的版本,一旦我向公众发布,轻量级迁移是否仍然有效?

这是一个更离散的例子:

xcdatamodel version 1.0  --> Release to public A
xcdatamodel version 1.1  --> unreleased (based on v1.0)
xcdatamodel version 1.2  --> unreleased (based on v1.1)
xcdatamodel version 1.3  --> Release to public B (based on v1.2)

我想确保当我提交版本 B 时,来自版本 A 的用户将被正确迁移。或者这是一种完全可怕的方法?我知道,如果我不关心测试设备上的数据,我只会将 xcdatamodel 1.3 版基于 1.0 版并将所有新内容放入该版本 - 我只是不想丢失我的测试设备上的数据已在设备上安装了 v1.1 和 v1.2 的应用版本。

谢谢!

【问题讨论】:

简短的回答是肯定的。您可以在发布之前删除中间开发模型。正如@Mike Weller 所提到的,轻量级迁移可以做的事情是有限制的,但是如果它在您的开发环境中工作,那么您已经知道轻量级迁移适合您。 【参考方案1】:

假设用于现有用户数据的格式可以通过自动轻量级迁移转换为当前格式,那么您创建内部未发布版本并不重要。

您需要在已发布的应用中包含以下内容:任何用户可能正在使用的每个版本。在您的情况下,看起来人们只会拥有 1.0 格式的商店,因此无需包含 1.1 或 1.2。如果情况并非如此——即,如果某处的某个用户可能拥有 1.1 或 1.2 版本的数据——那么您需要包含它们。

因此,只要 1.0 --> 1.3 更改适用于自动轻量级迁移并且没有用户拥有 1.1 或 1.2 格式数据,您就可以删除中间版本。

【讨论】:

谢谢汤姆!这正是我需要知道的。唯一让我感到困惑的是,如果删除 1.1 和 1.2,迁移将如何实际工作。我想象它是通过按顺序从数据模型的一个“迭代”到下一个“迭代”来工作的。根据你的回答,即使1.1和1.2后来被删除了,如果它能够弄清楚如何迁移1.0->1.3,那一定比这更神奇。如果您对此过程有任何见解,或者知道解释它的苹果文档,我很想知道。再次感谢! 在运行时,Core Data 知道当前模型是什么。如果启用了自动轻量级迁移,它会查看是否有任何非当前模型与现有持久存储匹配。当它找到一个时,它会将该模型与当前模型进行比较,以查看是否可以迁移。模型不是累积的——只有当前版本和非当前版本。 这很有意义。我想我被 xcode 抛弃了,因为当你创建一个新的模型版本时,它会询问你想要以哪个先前版本为新版本的基础。我认为这与迁移过程有关 - 我已经开悟了。非常感谢,汤姆! @Tom Harrington - 我知道这已经有一段时间没有发布了,但是你如何删除中间版本?我已经尝试选择并点击删除以及右键单击(删除为灰色)以及将其从 Finder 的包中删除 - 似乎没有任何效果。 XCode 6.1【参考方案2】:

轻量级迁移仅适用于某些类型的模型更改。最好的办法是彻底测试这一点。您可以安全地执行以下操作:

向实体添加新的可选属性或关系 为具有默认值的实体添加新的必需属性 将现有的可选属性更改为必需但具有默认值 重命名属性或关系或实体,并在核心数据实用程序窗格选项卡的“重命名 ID”字段中指定旧名称。

Core Data Model Versioning and Data Migration Programming Guide 列出了更多操作,但您应该再次测试所有这些。

【讨论】:

嗨,迈克,感谢您的回答。我想我把你引向了错误的方向。我并不是真的在问我的各种模型的变化是否是“可迁移的”——我很肯定它们是。我真的更想知道在我上面的示例中从版本 A 到版本 B 的用户是否会在升级时从 v1.0->v1.1->v1.2->v1.3 迁移,或者如果 v1. 1 和 v1.2 以某种方式被完全忽略。即我可以在发布之前删除模型的 v1.1 和 v1.2,还是应该不理会它们。

以上是关于未发布的 xcdatamodel 版本和轻量级迁移的主要内容,如果未能解决你的问题,请参考以下文章

轻量级数据迁移

对如何设置我的 .xcdatamodel 进行版本控制感到困惑

此NSPersistentStoreCoordinator没有持久性存储(架构不匹配或迁移失败)。它无法执行保存操作

iOS 核心数据轻量级迁移

CoreData 版本控制和阻塞轻量级迁移

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