ios - 核心数据-轻量级迁移和多个核心数据模型

标签 ios objective-c core-data core-data-migration

我提交的应用程序有两个coredata模型,我通过向当前模型添加一些属性来对该模型进行了一些更改。因此我向模型添加了新版本,并启用了轻量级迁移,但是在迁移reason = "Can't find model for source store"时会出现此错误

我遵循关于此问题[Core Data - lightweight migrations and multiple core data model files (xcdatamodel)] [2]的第二个答案,它在模拟器上效果很好,但在设备上不起作用,并且会引发相同的错误。

最佳答案

因此,最好是逐步进行说明...?

我在学习数据模型时遇到了困惑,所以我提出了自己的想法,这是我在核心数据教育的这一部分中偶然发现的问题……(顺便说一下,这实际上只是整个计划的开始)东西的)。

我没有足够强调阅读几本好书并根据其中包含的建议开发解决方案的重要性,因此请牢记这一点。

我经常向对核心数据感兴趣的人推荐一本书,摘自Marcus S. Zarra撰写的The Pragmatic Bookshelf –“ Core Data,第二版,iOS,OS X和iCloud的数据存储和管理”(2013年1月),以及特别是第3章标题为“版本和迁移”。

重要的是要认识到,要成功迁移,核心数据需要数据模型的所有先前原始完整的未经修订的版本。

为什么?

一个例子...


每次发布新版本的应用程序时,user1都会更新,但是在最新更新中,这与第三个最早的数据模型版本相关。
user2四个月没有更新应用程序-三个版本的App Store发行/版本,恰好与第七个最早的数据模型版本相关。
user3正在使用Android手机,意识到了自己的操作方式的错误,并在安装了您的应用程序后返回到他的iPhone 4,但未更新一年,这与第19个最早的数据模型版本相关,当时该应用程序使用了两个不同的数据模型容器。


那么,Core Data如何知道如何将先前应用程序的SQLite数据库迁移到当前版本,以便该数据库可以与您应用程序中的代码一起使用?

(现在我还不完全了解这一点,所以请原谅我的无知,但是)我的理解是Core Data使用数据模型先前版本的哈希符号值来识别您的应用当前正在使用的数据模型,并以此为基础,应用迁移来更新您的数据模型-这是重要的部分-一次一个数据模型版本!

这一点至关重要。了解这一点后,您将了解Core Data需要所有未修改的先前数据模型版本才能成功迁移。需要每个先前的数据模型版本才能成功完成迁移过程中的每个步骤。

让我们回顾一下我的例子。

当他们下载应用程序更新并在此最新更新之后首次运行该应用程序时:


user1的应用程序版本具有三个数据模型版本,可以进行迁移以迁移到与最新数据模型保持一致的SQLite数据库。
user2的应用程序版本具有七个数据模型版本,可进行迁移以迁移到与最新数据模型保持一致的SQLite数据库。
user3的应用程序版本具有19个要迁移的数据模型版本,但要添加到此版本,前两个数据模型必须在数据模型版本10和数据模型版本11之间进行合并(例如),以达到与之匹配的SQLite数据库最新的数据模型。


因此,如果您删除或更改任何以前的数据模型容器或版本,那么Core Data如何知道如何成功迁移?

考虑到这一点,我提供以下建议...


将所有以前的数据模型和版本保留在各自的.xcdatamodeld容器中。
如果必须迁移多个数据模型,请保留这些数据模型.xcdatamodeld容器的原始版本,并在必要时使用适当的Core Data方法合并这些容器。


直接回答这个问题,我怀疑您在某个阶段已经修改了先前的数据模型容器或版本,以适合您在模拟器上的测试。在设备上进行测试时,设备上数据模型的“不同”哈希符号值与数据模型版本容器中剩余的任何内容都不匹配,因此Build&Run会引发您在问题中指出的错误。

我的建议是按原样重建数据模型版本容器(.xcdatamodeld文件),以使Core Data能够正确迁移所有以前的版本(并根据需要合并模型容器),以到达合适的最新SQLite数据库。 。

希望这可以帮助。

让我知道我是否错过了分数,我将继续调查。

关于ios - 核心数据-轻量级迁移和多个核心数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23734999/

相关文章:

ios - [iOS][Objective-c] 图像选择器到下一个 Controller

iphone - Objective-C iPhone 应用程序与 MonoTouch 应用程序有多大?

ios - 使用 Core Data 存储自定义对象

ios - 核心数据子查询 : no such column

ios - 使用点击和/或边缘滑动关闭模态视图 Controller

ios - CoreStore 分段列表监视器如何在运行时指定 .where 子句

ios - 各种屏幕尺寸的布局问题

iphone - 当我们有 xcode 时,airplay sdk 的实用程序是什么?

ios - UIPageviewController 使用 Storyboard 崩溃

ios - 从静态方法调用 NSXMLParser 不解析