iOS:核心数据错误:NSManagedObject的NSMergeConflict

时间:2010-11-17 15:58:36

标签: ios core-data

我有一个核心数据,有多对多的文章与类别的关系。尝试保存时,我收到以下错误。我无法找到有关它意味着什么的信息,以及为什么在数据库为空时有两个版本。任何人都能解释一下吗?

错误:NSMergeConflict (0x76ae720) for NSManagedObject (0xd945560) with objectID '0xd943550 <x-coredata://09A438A8-E3F5-45FE-B9D7-106798E82E18/Article/p91>' with oldVersion = 1 and newVersion = 2

代码:

NSMutableDictionary *dict   = [[data objectAtIndex:i] valueForKey:@"category_names"];
        NSMutableArray      *values = [[NSMutableArray alloc] init];
        for (NSString *value in [dict allValues]) {
            NSLog(@"value = %@", value);
            [values addObject:value];
        }

        NSMutableSet *setElements = [[NSMutableSet alloc] init];
        for (int i = 0; i < [values count]; i++) {
            Category *cat = [self getCategoryFor:[values objectAtIndex:i]]; // Function which has fetch to get the category for the value "name"
            [setElements addObject:cat];
        }

        if ([setElements count] > 0) 
            [article addCategories:setElements];


        // Save the context.
        NSError* error;
        if (![managedObjectContext save:&error]) {
            NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
            NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
            if(detailedErrors != nil && [detailedErrors count] > 0) {
                for(NSError* detailedError in detailedErrors) {
                    NSLog(@"  DetailedError: %@", [detailedError userInfo]);
                }
            } else
                NSLog(@"  %@", [error userInfo]);
        }

        [article release];
        [values release];
        [setElements release];

1 个答案:

答案 0 :(得分:4)

您获得的错误实际上与数据本身无关,而是由于两个不可调和的数据模型版本写入同一个持久存储文件而导致的错误。

您必须已创建数据模型,使用它将一些数据写入持久性存储,然后更新模型。除非您更改自动迁移无法合并新旧数据的数据模型,否则通常不会出现问题。

如果仍在开发中并且您不需要现有数据,最简单的解决方案是从模拟器中删除应用程序,然后仅使用最新的数据模型再次构建和运行它。这将不需要迁移,因此将跳过合并错误。