Iphone 核心数据迁移“无法将模型与名为“foo”的两个不同实体合并”
我知道这是一个经常被问到的问题,但是我发现没有一个解决方案适合我 这就是我的情况: 我的应用程序有一个数据模型,我想给它添加版本控制。所以在XCode中,我做了设计->数据模型->添加模型版本。我还更新了我的代理的persistentStoreCoordinator方法,如下所示:Iphone 核心数据迁移“无法将模型与名为“foo”的两个不同实体合并”,iphone,core-data,migration,Iphone,Core Data,Migration,我知道这是一个经常被问到的问题,但是我发现没有一个解决方案适合我 这就是我的情况: 我的应用程序有一个数据模型,我想给它添加版本控制。所以在XCode中,我做了设计->数据模型->添加模型版本。我还更新了我的代理的persistentStoreCoordinator方法,如下所示: - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator != nil) {
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
stringByAppendingPathComponent: @"foo.sqlite"]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
/*Error for store creation should be handled in here*/
}
return persistentStoreCoordinator;
}
为了确保一切正常,我做了一个全新的构建,并在模拟器中进行了测试。到目前为止一切正常
接下来,我选择了新版本的数据模型,使用XCode将其设置为当前版本,并向实体添加了一个额外的属性。然后,我做了一个干净的所有,建设。现在,每当我启动应用程序时,它就会崩溃,并出现以下错误:“无法将模型与名为‘foo’的两个不同实体合并。”
我做错了什么?我已经尝试确保没有向目标添加任何数据模型,只向目标添加当前版本的数据模型,以及两者。每次我测试的时候,我都会把所有的东西都清理干净
有人能解释一下为什么它对我不起作用吗
编辑:
以下是我的managedObjectModel方法:
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
我已经预料到managedObjectModel getter的这种实现 在您的实现中,捆绑包中的所有模型都合并到一个模型中。因此,.momd中的所有版本也会合并,从而产生重复的实体定义 更改代码以使用适当的模型文件显式初始化模型,它应该可以正常工作
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"datamodel" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
如果在核心数据上使用版本模型,则必须始终初始化为要使用的模型版本。在应用程序包中,您将找到一个扩展名为.momd的文件,它是完整的模型。在这个文件中,您会发现许多.mom文件,每个.mom文件代表您模型的一个版本
如果运行应用程序并使用.momd文件和其中的所有版本进行初始化,则Core Data将创建所有版本,稍后将出现复制实体错误,Core Data不知道使用的是什么版本。现在,解决此问题的唯一方法是删除应用程序,将代码指向正确的.mom文件并再次运行,因此核心数据只创建一个版本的内部数据库
下面是一段执行此任务的代码:
NSString *fullModelName = @"myModel.momd"; // The name of the main model.
NSString *modelVersionName = @"myModel1.0.mom"; // Only the name of the version.
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSString *modelPath = [NSString stringWithFormat:@"%@/%@/%@", bundlePath, fullModelName, modelVersionName];
//
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
请添加您的-NSManagedObjectModel*managedObjectModel方法。我怀疑存在问题。这样做,我会得到一个不同的错误:这个NSPersistentStoreCoordinator没有持久存储。它无法执行保存操作。请记录modelPath以查看您是否确实加载了有效的托管对象模型。我最终没有使用自动推断映射模型的选项,而是定义了自己的映射模型。现在一切正常。谢谢我记录了NSPersistentStoreCoordinator的错误,它表示无法推断映射模型。NSString*modelPath=[NSString stringWithFormat:@%@/Contents/Resources/%@/%@,bundlePath,fullModelName,modelVersionName];