我有一个使用核心数据的cocoa应用程序,它现在是其托管对象模型的第4版。
我的托管对象模型包含抽象实体,但到目前为止,我已设法通过创建适当的映射模型并使用addPersistentStoreWithType创建我的持久存储来实现迁移:配置:选项:错误并将NSMigratePersistentStoresAutomaticallyOption设置为YES。
NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
NSURL *url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @"MyApp.xml"]];
NSError *error=nil;
[theCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:optionsDictionary error:&error]
当我从模型版本3迁移到4时,这种方法很有效,这是一个涉及向多个实体添加属性的迁移。现在,当我尝试添加新的模型版本(版本5)时,对addPersistentStoreWithType的调用返回nil,错误仍为空。从4迁移到5涉及添加单个属性。
我正在努力调试问题并检查了以下所有内容;
源数据库实际上是版本4,而persistentStoreCoordinator的托管对象模型是版本5.
我的构建应用程序的resources文件夹中存在4→5映射模型以及版本4和5的托管对象模型。
我尝试了各种模型升级路径。奇怪的是,我发现从早期版本3升级 - > 5作品..但从4升级 - > 5失败。
我尝试添加自定义实体迁移策略,用于迁移属性正在发生变化的实体...在这种情况下,我覆盖了方法beginEntityMapping:manager:error :.有趣的是,当迁移工作时(即当我从3迁移到4或从3迁移到5)时,会调用此方法,但在失败的情况下(4到5)不会调用它。
我几乎不知道该去哪里。任何有助于调试此问题的想法都将非常感激。
答案 0 :(得分:16)
我在这里回答我自己的问题,以防有人帮忙。
关键问题是,当我到达对象模型的第4版时,我还为项目添加了一个额外的托管对象模型。这个附加模型与我的主模型是分开的,仅用于在另一个线程上创建一个缓存,并包含与主模型无关的数据。
愚蠢的是,我仍然使用
初始化了我的managedObjectModelmanagedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]
在我的案例中创建了一个模型,其中包含来自我的主模型以及我的其他模型的实体。这些不需要的实体在我的数据库中有他们的版本哈希。当核心数据然后去寻找匹配所有这些哈希的managedobjectmodel时,它自然无法找到它。
在我的情况下,解决方案是在迁移之前手动清理我的db文件(从不需要的实体中删除versionhashes)..然后将我的managedObjectModel加载代码更改为;
NSString *path = [[NSBundle mainBundle] pathForResource:@"MyDataModel" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];