跳过核心数据迁移

Posted

技术标签:

【中文标题】跳过核心数据迁移【英文标题】:Skip core data migration 【发布时间】:2013-05-02 05:17:34 【问题描述】:

我对核心数据模型进行了很多更改。过去我们使用简单的自动迁移。但是,这一次将失败。由于我真的不关心正在迁移的数据,我只想在自动迁移失败时删除持久存储并重新设置它。这是一个有效的方法吗?有什么我要小心的吗?这会让我的应用被拒绝吗?

【问题讨论】:

【参考方案1】:

这样做有一些明确的问题,你需要小心。 This answer 从 NSManagedObjectContext 的文档中得到了一些很好的建议

上下文总是有一个“父”持久存储协调器,它 提供模型并将请求分派给各种持久化的 包含数据的商店。没有协调者,上下文就不是 功能齐全。上下文的协调器提供托管的 对象模型和处理持久性。从一个获取的所有对象 外部存储与全局一起在上下文中注册 用于唯一标识的标识符(NSManagedObjectID 的一个实例) 将每个对象标识到外部存储。

当在我们的一个应用程序中遇到类似情况时,我选择创建一个新的持久性存储,并弃用旧的,因为我们的旧存储在我们的许多设备上被之前的错误迁移搞砸了。它最终比我希望的更混乱,但它确实奏效了。

您的计划存在的问题并非无法克服,我只是建议您谨慎行事。我喜欢 Giao 关于使用 NSManagedObjectContext 重置的建议。删除和重建时,持久存储协调器可能会感到困惑。我担心,因为苹果似乎在幕后做了很多事情。我也担心,因为似乎核心数据在已发布应用上的表现与在我们的调试版本上表现不同,尤其是在升级过程中。

我认为您很聪明地认识到您的自动迁移将遇到问题,并且您正在寻找另一条路径。在最近的过去,我看到一个小组真的不得不花一个月的时间来处理他们应用程序中失败的数据迁移。

【讨论】:

您能否详细说明我的方法存在哪些问题? @HalR:您链接到的问题/答案是关于清空已打开的持久存储。我感觉这里的情况要简单得多:如果addPersistentStoreWithType由于迁移问题而失败,您可以删除存储文件并再次调用addPersistentStoreWithType Martin 你是说这个解决方案吗? ***.com/questions/9548010/… 我的解决方案有点像这个。但我有点害怕这可能会产生一些影响(应用程序拒绝或以某种方式破坏我的持久存储) @Martin R 我试图表达我的担忧,因为我在类似情况下有过和观察到的糟糕经历。如果他们成功实现了这一点,我很乐意从其他人那里获得更多意见。

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

Laravel 5 - 跳过迁移

合并或跳过核心数据模型的版本

工匠跳过迁移

如何使用 Django migrate 命令跳过迁移?

如何使用 flyway 跳过特定的迁移?

在非连续版本之间迁移时出现核心数据迁移错误