核心数据迁移:'无法将模型与两个不同的实体合并......'

时间:2011-05-23 08:57:48

标签: ios core-data migration

我在Core Data模型中添加了新版本。我将新属性添加到一个实体(Seriese

但它引发异常

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't merge models with two different entities named 'Seriese'' 

我使用以下代码:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationPrivateDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataTutorialPart4.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:  
                                            [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,  
                                            [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];


    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}

有任何解决此错误的建议吗?我不想丢失保存的数据

2 个答案:

答案 0 :(得分:1)

问题很可能来自于您如何加载托管对象模型。默认的方法是合并bundle中的模型,但是在这种情况下你实际上有两个具有相同实体的模型(v1和v2)......这里很好地解释了.... Migration Issues

答案 1 :(得分:1)

核心数据不理解两个模型中的实体Seriese旨在是同一个实体,并且它应该将旧Seriese的属性转换为新的Seriese。相反,它认为新的Seriese应该被视为一个全新的实体。

这通常是由于尝试对自动迁移无法处理的新版本进行更改而引起的。自动迁移可以处理对属性名称的更改,添加属性或其他不会影响单个实体之外的任何更改。一旦开始更改关系和/或添加新实体,就必须进行手动迁移。

你可以打电话

+[NSMappingModel inferredMappingModelForSourceModel:destinationModel:error:] 

...测试是否可以进行自动迁移。如果它返回nil和/或错误,那么你不能。