CoreData实现使用的是第三方库MagicalRecord。
版本不断覆盖时需要对数据库进行迁移,经过不断打包测试,发现以下规律:
a、表中增加模型,覆盖安装后上一个版本表中数据无法再取出
b、A模型中新增加字段,覆盖安装后,访问A模型数据,程序闪退,必须删除以前版本重新安装,才能正常访问表中A模型的字段
c、A模型中删除字段,覆盖安装后,对应用无影响
所以,只要数据库表中有增加删除模型,模型增加字段等,都需要先做好版本迁移工作。具体步骤如下:
1、选中当前CoreData的工作表(LearnDriver 2.xcdatamodel是我已经建好了的后的结果)
2、点击Editor中的Add Model Version,使用默认设置后下一步
3、所有的对表中模型、字段的修改均在新的表中进行
4、选中最初的那个表文件
5、在右边控制面板第一个选项,Model Version中选择最新的表
6、最后代码调整,MagicRecord只需要用下面代码初始化数据库即可(对应原生CoreData中创建数据库时的option选项字典,详情看框架内部实现)
7、大功告成!
在我这个项目中,线上有两个版本,未配置数据库升级工作,导致一旦覆盖安装以前的数据就无法再取出。一直以来对表的操作都是直接在最初的表文件修改,添加模型、模型添加字段等。此时如果在这个已经更改的表文件上再按照上面的操作迁移版本是行不通的。解决方案是从找到线上第一个版本对应的表文件,假设叫A.xcdatamodel,拷贝。当前工作版本的表文件,假设是A++.xcdatamodel。用A替换掉A++,然后按照上面方法进行数据库迁移,然后在新的表上将所有A++相比A所增加的模型、字段添加上去,再重新创建新添加的模型文件即可。
8、如何删除旧的data model version(你会发现无法直接在工程左侧目录删除)
这是一个小技巧:
在Finder中显示.xcdatamodeld包内容 ,右键从工程中删除.xcdatamodeld,保留文件,删除不想要的.xcdatamodel旧版本文件,再重新将.xcdatamodeld添加到项目中。
设置好当前要使用的版本;
在XCode中删除.xcdatamodeld的引用 (Right-click -> Delete ->Remove Reference Only);
在Finder中显示.xcdatamodeld包内容 (Right-click -> Show Package Contents);
删除不想要的.xcdatamodel旧版本文件;
重新将.xcdatamodeld添加到项目中。