关于MagicalRecord在版本迁移的问题
我现在维护的项目的数据库方面,使用的是CoreData,完全自己手写相关的代码,整个工程的使用一个xcdatamodeld,NXMain.xcdatamodeld,版本升级维护到了ver21。
现今组长想拆分,根据组内成员各自负责的模块来创建多个xcdatamodeld,并且使用第三方库MagicalRecord来简化代码,由于数据库涉及的代码比较多,项目时间紧,所以不能在一次迭代中更改完成,需要分版本进行:
第一个版本,仅仅将消息模块的数据库替换,新建Message.xcdatamodeld,把相关的entity全部创建在此model中;
第二个版本,将圈子相关的数据库替换,新建Circle.xcdatamodeld,写这篇文档的时候是在第三个版本的开发过程中;
第三个版本,将所有的模块全部全部替换成新数据库,创建多个xcdatamodeld,开发中要对message的一个entity添加一个字段,于是给Message.xcdatamodeld升级到ver2。
一个问题出现了,数据库在iOS8的设备上自动迁移出现了问题,提示说“Can't find model for source store”,控制台打印了,新旧数据库的设置信息,以及各个entity的hash值,具体的log就不在此粘贴了。
然后在stackoverflow,以及MagicalRecord的github上的issue上查找该问题,其他人也遇到过该问题。
MagicalRecord在生成NSManagedObjectModel的时候调用了mergedModelFromBundles:方法,而该方法会将工程中所有的entity汇集在一起,包括项目中Pod里面的xmpp对应entity,在一个sqlite中生成对应的表,而我们只是想生成我们新建的xcdatamodeld对应的表。所以问题的解决方案如下:
将这个工程的xcdatamodeld集合到一个NXMainCoreData.xcdatamodeld中,包括pod中得xcdatamodeld,还包括对应的relationship,已经各种设置,这个是NXMainCoreData.xcdatamodeld的第一个版本,然后升级一个版本,就是ver2,想怎么改就怎么该,在ver2中,我将xmpp对应的entity删除了,当然还有其他的操作,然后在[MagicalRecord setupCoreDataStack],要设置一下MagicalRecord默认的NSManagedObjectModel:
NSString* DatabaseFileMODEL =@"NXMainCoreData";
NSURL*modelURL = [[NSBundlemainBundle]URLForResource:DatabaseFileMODELwithExtension:@"momd"];
if(modelURL ==nil)
modelURL = [[NSBundlemainBundle]URLForResource:DatabaseFileMODELwithExtension:@"mom"];
if(modelURL !=nil) {
NSManagedObjectModel* model = [[NSManagedObjectModelalloc]initWithContentsOfURL:modelURL];
if(model !=nil) {
[NSManagedObjectModelMR_setDefaultManagedObjectModel:model];
}
}
这样MagicalRecord只会生成NXMainCoreData对应的entity的表了。