更新时间:2022-10-03 17:08:32
本节书摘来自华章出版社《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,以启用轻量级迁移:
在演示其他迁移方式之前,我们需要生成一些测试用的数据。程序清单3-2里的代码可以根据Measurement实体来生成托管对象。
请按下列步骤修改Grocery Dude,以便生成测试用的数据:
下一步是重新配置demo方法,令其显示出持久化存储区里的一部分内容。程序清单3-3中的代码可以获取少量Measurement样例数据。注意,我们通过新的选项把获取到的结果数量限制为50。从大的数据集中获取数据时,这个限制选项很有用处,如果能和排序操作结合起来就更好了,比方说,可以按某项标准列出排名前50的数据。
请按下列步骤修改Grocery Dude,以防应用程序再次插入测试数据:
在学习下一节之前,一定要先关掉SQLite Database Browser。