通过迁移将核心数据实体及其数据移动到新的核心数据模型文件中

Posted

技术标签:

【中文标题】通过迁移将核心数据实体及其数据移动到新的核心数据模型文件中【英文标题】:Move a Core Data entity and its data into new Core Data model file through Migration 【发布时间】:2015-08-06 08:57:08 【问题描述】:

是否可以使用迁移将核心数据实体Car 及其在Model1 中的数据移动到新的核心数据模型Model2 中? Model2 还将有一个新的 CarOwner 实体 + 其他新关系(因此模型文件不同于 Model1)。这可以使用轻量级迁移还是我必须使用自定义迁移?我正在使用 Magical Record 设置我的核心数据堆栈。

多年来,我一直在成功使用轻量级迁移。所以我没有任何自定义迁移机制。我想在实施新系统之前先询问一下,以便将 CD 自定义迁移合并到我现有的 MagicalRecord 核心数据堆栈中。

编辑:更新问题以澄清 Model1Model2 存在差异。

【问题讨论】:

【参考方案1】:

使用相同的 xcdatamodel 文件和不同的版本,您可以使用映射模型文件,但作为不同的 mom 文件,我猜这些是不同的堆栈,迁移将不起作用。

【讨论】:

那么这可以使用自定义迁移吗? @Buju 我不这么认为。如果您不想让她们真正分开,为什么还需要两个不同的妈妈? 因为Model1 已经有很多版本了。其中一些有警告。 Model1 结构已经很老了。现在我需要将所有现有数据迁移到一个更大、更现代的新Model2。我想再次使用模型版本 1 开始 Model2 但重点是,我想摆脱产生警告的旧版本。而且我有多个(旧)模型文件,我想将它们全部合并到Model2 经过大量研究,结果表明可以使用自定义映射模型.xcmappingmodel 和自定义迁移将实体从一个模型文件迁移到另一个文件。【参考方案2】:

模型迁移仅在模型发生更改时才相关——也就是说,如果数据模型中包含的实体与持久存储文件中保存的实体不匹配。迁移不取决于您使用的模型文件,它取决于该模型中包含的实体哈希。

含义:如果您的新模型文件与持久存储文件具有完全相同的实体,则您实际上不需要迁移任何内容。刚开始使用新的模型文件。 但是请记住,如果您放弃旧模型文件及其所有旧版本,您将无法再从该模型的旧版本迁移。

【讨论】:

这就是重点。我需要保留所有旧版本,所以我的所有用户仍然可以迁移到最新版本。而且模型不会保持不变。它发生了变化,所以我肯定需要迁移。 那么...移动到新模型文件有什么意义呢?在@Lucien 回答的 cmets 中,您谈到了您想摆脱的 Model1 的所有问题。我真的不知道你还希望完成什么。 可以更准确地说:Model1 目前仅在应用程序中。但现在我需要将我的模型文件移动到(共享)库中,以便其他应用程序可以使用相同的模型文件Model2。出于这个原因,Model2 与其他实体和新关系高度增强。所以app1需要将数据从Model1迁移到Model2。但随后另一个新应用程序将开始使用 Model2 的共享库,因此 app2 不会收到来自 Model1 的所有警告。我没有解释这一点,因为我想要的正是我在问题中提出的问题。将实体迁移到另一个 Core Data 模型文件。

以上是关于通过迁移将核心数据实体及其数据移动到新的核心数据模型文件中的主要内容,如果未能解决你的问题,请参考以下文章

核心数据迁移:将字段提取到抽象实体子项

加密核心数据迁移实体名称不匹配问题

涉及新实体和一对多关系的核心数据迁移

核心数据版本控制和迁移

强制核心数据更新模型

核心数据模型迁移步骤