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

时间:2014-05-19 10:08:41

标签: 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]上遵循第二个答案,它在模拟器上运行良好,但在设备上无法工作并发出同样的错误。

Navigator scrrenshot

1 个答案:

答案 0 :(得分:1)

所以也许一步一步解释最好......?

我在学习数据模型时遇到了困惑,所以我提出了自己的想法,关于我在核心数据教育的这一部分中偶然发现的问题......(顺便说一句,这只是刚开始的时候)事情的总体方案。)

我无法强调阅读几本好书并根据其中所载的建议开发解决方案的重要性......所以考虑到这一点......

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

重要的是要认识到要成功迁移,核心数据需要数据模型的所有以前原始的未经过更改的版本

为什么?

一个例子......

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

所以如何是核心数据知道如何将以前应用程序的SQLite数据库迁移到当前版本,以便数据库可以使用您应用程序中的代码?

(现在我完全不明白这一点,请原谅我的无知,但是)我的理解是,核心数据使用以前版本的数据模型的散列签名值来确定您的应用当前使用的数据模型,并在此基础上,应用迁移来更新您的数据模型 - 这是重要的部分 - 一次一个数据模型版本

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

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

当他们下载应用更新时,并在最新更新后第一次运行应用程序:

  • user1的应用程序版本有三个要迁移的数据模型版本,以获得与最新数据模型一致的SQLite数据库。
  • user2的应用程序版本有七个数据模型版本需要迁移才能到达与最新数据模型一致的SQLite数据库。
  • user3的应用程序版本有19个要迁移的数据模型版本,但要添加到此,前两个数据模型必须在数据模型版本10和数据模型版本11(例如)之间合并,才能到达在与最新数据模型一致的SQLite数据库中。

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

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

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

在直接回答这个问题时,我怀疑在某个阶段您修改了以前的数据模型容器或版本,以适应您在模拟器上的测试。在设备上进行测试时,"不同的"设备上的数据模型的哈希签名值与数据模型版本容器中保留的任何内容都不匹配,因此Build& Run会抛出您在问题中记下的错误。

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

希望这有帮助。

如果我错过了标记,请告诉我,我会继续调查。