在开发的后期,可能因为完善和修复功能,需要对Coredata数据库表进行修改,这样就需要对CoreData进行版本升级。
比如你修改了DB字段以后,用户在旧版本上升级为新版本时会crash. 因为升级只升级了应用app,没有升级目录下的数据据db文件。在开发当中,只需要删除了app再重新安装一次就可以解决了。如果是上传到appstore的软件,那你可要小心处理了,没有经过整合migrate处理的app,用户升级后必然会crash.这时就需要用到Coredata的升级处理了。
版本升级步骤:
一、1.新建模型版本 (选中可视化建模文件, 点击editor, 选择addModelVersion)
二、把当前新建的模型版本设置成选中状态,选择为当前版本 (先选中总的模型版本, 然后在属性检查器中的第一个标签有个current,选中新建的即可)
三、删除旧的映射文件类,重新创建新映射文件(cmd + n , 在coreData选项卡中, 选择NSManageObject subclass), 记住创建时选择新的model.(因为类的属性都变了,所以要生成新的关联类)
四、在生成NSManageObjectContext时,把数据连接器persistentStoreCoordinator中的懒加载方法中, option选项由nil变成一个字典, key为NSMigrate, value为@{YES}, 该选项的意思是, 模型版本自动升级 (数据库升级)
NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption , nil];//添加的字典
//加入到存储器中
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:optionsDictionary error:&error]) {
}
//添加 *optionsDictionary,原来options:nil 改成options:optionsDictionary
重新编译一下。你可以进入沙盒打开表文件,你会发现,如果是以前的数据,新加的属性字段都为空。这样,你上架更新后都不会因为数据原因造成崩溃,而且也不会把以前的数据弄丢。