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