本节书摘来自华章出版社《core data应用开发实践指南》一书中的第3章,第3.3节,作者 (美)tim roadley,更多章节内容可以访问云栖社区“华章计算机”公众号查看
把新模型设为当前版本之后,必须迁移现有的持久化存储区,只有这样,才能正常使用新模型。这是因为,持久化存储区协调器会试着用新版的模型来打开原有的存储区,但由于原有的存储区是用旧版模型创建的,所以该操作会失败。在向nspersis-tentstorecoordinator添加存储区的时候,只需将下列选项放在nsdictionary里传过去,即可自动完成存储区的迁移工作:
如果传给nspersistentstorecoordinator的nsmigratepersistentstores-automaticallyoption是yes,那么core data就会试着把低版本的(也就是与当前模型不兼容的)持久化存储区迁移到最新版本的模型。
如果传给nspersistentstorecoordinator的nsinfermappingmodelaut-omaticallyoption是yes,那么core data就会试着以最为合理的方式自动推断出源模型实体(source model entity)中的某个属性到底对应于“目标模型实体”(destination model entity)中的哪一个属性。
把上述两个选项都打开并传给nspersistentstorecoordinator,这种迁移方式就叫做轻量级迁移(lightweight migration),程序清单3-1中的粗体代码演示了该方式。我们修改了coredatahelper.m文件中的loadstore方法,在里面设定了这两个选项。请注意,假如在开发core data程序时还使用了icloud,那么只能采用这种迁移方式。

请按下列步骤修改grocery dude,以启用轻量级迁移:
修改coredatahelper.m文件中的loadstore方法,用程序清单3-1里的代码把原有代码替换掉。笔者用粗体标出了改动的部分,以示强调。
重新运行应用程序,这次应该就不会崩溃了。
从现在开始,只需把新模型设为当前版本并启用轻量级迁移,core data就会无缝地完成迁移过程。
在演示其他迁移方式之前,我们需要生成一些测试用的数据。程序清单3-2里的代码可以根据measurement实体来生成托管对象。
请按下列步骤修改grocery dude,以便生成测试用的数据:
根据measurement实体创建nsmanagedobject子类。创建步骤在第2章中讲过:首先选中实体,然后点击editor>create nsmanagedobject subclass...菜单项,并按提示操作。在保存类文件这个步骤中,别忘了勾选targets里的“grocery dude”。
把#import"measurement.h"添加到appdelegate.m顶部。
修改appdelegate.m文件的demo方法,用程序清单3-2中的代码替换掉原有代码。
运行一遍应用程序。这次它会向持久化存储区里插入大量测试数据,你可以从控制台的日志中观察到这一操作。根据电脑执行程序的快慢,该操作可能要花些时间。请耐心等待这些数据插入完毕。为了于稍后演示迁移的速度,我们现在必须在持久化存储区中放入大量数据。
只要运行一遍应用程序,持久化存储区里就会有测试数据了,所以现在无需再次启动应用程序,以免它又向存储区中重复添加数据。请注意,items这个表格视图里面还没有内容,因为我们还没有把它要显示的内容配置好。
下一步是重新配置demo方法,令其显示出持久化存储区里的一部分内容。程序清单3-3中的代码可以获取少量measurement样例数据。注意,我们通过新的选项把获取到的结果数量限制为50。从大的数据集中获取数据时,这个限制选项很有用处,如果能和排序操作结合起来就更好了,比方说,可以按某项标准列出排名前50的数据。
请按下列步骤修改grocery dude,以防应用程序再次插入测试数据:
修改appdelegate.m文件中的demo方法,用程序清单3-3替换掉方法里原有的代码。
运行应用程序。
用sqlite database browser工具查看grocery-dude.sqlite文件的内容,第2章曾讲过该工具的用法。图3-4演示了正常的操作结果。
在学习下一节之前,一定要先关掉sqlite database browser。