本节书摘来自华章出版社《Core Data应用开发实践指南》一书中的第3章,第3.1节,作者 (美)Tim Roadley,更多章节内容可以访问云栖社区“华章计算机”公众号查看
3.1 修改托管对象模型
在应用程序的进化过程中,其托管对象模型也可能需要改变。对于一些比较简单的修改,诸如设定属性的默认值、设定验证规则、使用获取请求模板等,是可以直接实施的。而对于另外一些更为结构化的(structural)修改,则需先把持久化存储区迁移到新的模型版本才行。假如没有提供迁移数据所需的映射与设定,那么应用程序就会崩溃。
为了继续构建范例程序,需要把上一章中的代码添加到Grocery Dude项目中。或者可以去http://www.timroadley.com/LearningCoreData/GroceryDude-AfterChapter02.zip下载ZIP文件,并将其解压缩,这个文件包含了项目到目前为止的全部内容。在使用来自ZIP文件的Xcode项目时,应该先点击Product>Clean菜单项,这样可以清除掉同名项目所残留的缓存。在学习本章的过程中,最好能用iOS 仿真器来运行程序,因为这样更容易查看到SQLite数据库文件里的内容。
请按下列步骤修改Grocery Dude,以引发模型不兼容错误:
- 运行Grocery Dude,确保程序用现有模型创建持久化存储区。你应该会在控制台日志里看到Successfully added store字样。
- 在Xcode界面里选中Model.xcdatamodeld。
- 添加名为Measurement的新实体。
- 选中Measurement实体,添加名为abc的属性,并将其类型设为String。
- 重新运行应用程序,并观察控制台输出的日志。你将会看到图3-1里的这个错误,它应该算是Core Data开发中最为常见的错误之一。假如没有发生该错误,请删除应用程序,并点击Product>Clean菜单项,然后从第1步开始再试一次。
对于处在开发初期的应用程序来说,这种崩溃算不上什么大问题,我们只需把程序删了并重新运行一遍就好。删除之后,再次运行应用程序时,它会按照最新的模型来创建持久化存储区。这样一来,存储区就可以和模型相兼容了,于是应用程序也就不再崩溃了。但是,这样做也会失去存储区里原有的数据。对于已经在App Store上架的程序来说,这让人无法接受。有好几种办法都可以迁移现有的持久化存储区,而迁移路径则是由变更的复杂程度以及是否使用iCloud等因素来决定的。无论采用哪种迁移办法,我们都必须首先熟悉“模型版本控制”(model versioning)。
请按下列步骤修改Grocery Dude,以便将模型恢复到修改前的状态:
- 选定Model.xcdatamodeld。
- 删除Measurement实体。
- 重新运行应用程序,这次应该不会崩溃了。