《Core Data应用开发实践指南》一3.3 轻量级的迁移方式

简介:

本节书摘来自华章出版社《Core Data应用开发实践指南》一书中的第3章,第3.3节,作者 (美)Tim Roadley,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.3 轻量级的迁移方式

把新模型设为当前版本之后,必须迁移现有的持久化存储区,只有这样,才能正常使用新模型。这是因为,持久化存储区协调器会试着用新版的模型来打开原有的存储区,但由于原有的存储区是用旧版模型创建的,所以该操作会失败。在向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,那么只能采用这种迁移方式。
image

请按下列步骤修改Grocery Dude,以启用轻量级迁移:

  1. 修改CoreDataHelper.m文件中的loadStore方法,用程序清单3-1里的代码把原有代码替换掉。笔者用粗体标出了改动的部分,以示强调。
  2. 重新运行应用程序,这次应该就不会崩溃了。
    从现在开始,只需把新模型设为当前版本并启用轻量级迁移,Core Data就会无缝地完成迁移过程。

在演示其他迁移方式之前,我们需要生成一些测试用的数据。程序清单3-2里的代码可以根据Measurement实体来生成托管对象。
image

请按下列步骤修改Grocery Dude,以便生成测试用的数据:

  1. 根据Measurement实体创建NSManagedObject子类。创建步骤在第2章中讲过:首先选中实体,然后点击Editor>Create NSManagedObject Subclass...菜单项,并按提示操作。在保存类文件这个步骤中,别忘了勾选targets里的“Grocery Dude”。
  2. 把#import"Measurement.h"添加到AppDelegate.m顶部。
  3. 修改AppDelegate.m文件的demo方法,用程序清单3-2中的代码替换掉原有代码。
  4. 运行一遍应用程序。这次它会向持久化存储区里插入大量测试数据,你可以从控制台的日志中观察到这一操作。根据电脑执行程序的快慢,该操作可能要花些时间。请耐心等待这些数据插入完毕。为了于稍后演示迁移的速度,我们现在必须在持久化存储区中放入大量数据。
    只要运行一遍应用程序,持久化存储区里就会有测试数据了,所以现在无需再次启动应用程序,以免它又向存储区中重复添加数据。请注意,Items这个表格视图里面还没有内容,因为我们还没有把它要显示的内容配置好。

下一步是重新配置demo方法,令其显示出持久化存储区里的一部分内容。程序清单3-3中的代码可以获取少量Measurement样例数据。注意,我们通过新的选项把获取到的结果数量限制为50。从大的数据集中获取数据时,这个限制选项很有用处,如果能和排序操作结合起来就更好了,比方说,可以按某项标准列出排名前50的数据。
image

请按下列步骤修改Grocery Dude,以防应用程序再次插入测试数据:

  1. 修改AppDelegate.m文件中的demo方法,用程序清单3-3替换掉方法里原有的代码。
  2. 运行应用程序。
  3. 用SQLite Database Browser工具查看Grocery-Dude.sqlite文件的内容,第2章曾讲过该工具的用法。图3-4演示了正常的操作结果。

image

在学习下一节之前,一定要先关掉SQLite Database Browser。

相关文章