Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心数据迁移“无法将模型与名为“foo”的两个不同实体合并”_Iphone_Core Data_Migration - Fatal编程技术网

Iphone 核心数据迁移“无法将模型与名为“foo”的两个不同实体合并”

Iphone 核心数据迁移“无法将模型与名为“foo”的两个不同实体合并”,iphone,core-data,migration,Iphone,Core Data,Migration,我知道这是一个经常被问到的问题,但是我发现没有一个解决方案适合我 这就是我的情况: 我的应用程序有一个数据模型,我想给它添加版本控制。所以在XCode中,我做了设计->数据模型->添加模型版本。我还更新了我的代理的persistentStoreCoordinator方法,如下所示: - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator != nil) {

我知道这是一个经常被问到的问题,但是我发现没有一个解决方案适合我

这就是我的情况: 我的应用程序有一个数据模型,我想给它添加版本控制。所以在XCode中,我做了设计->数据模型->添加模型版本。我还更新了我的代理的persistentStoreCoordinator方法,如下所示:

- (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];