iPhone Coredata错误(NSMergeConflict for NSManagedObject)

ruf*_*tsk 17 iphone core-data

有时我在同一个地方有coredata这个错误.有时它确定,在其他时间我有这个错误.这是什么意思?我找不到任何关于它的东西:(

抱歉我的英语:)

照片; id:0xd431570; 数据:{\n aid = 121594781; \n album = nil; \n comments = \\"\\"; \n commentsCount = 0; \n created = \\"2010-12-10 03:43:01 GMT \\"; \n owner = \\"0xd41b500 \\"; \n \\"owner_id \\"= 79185807; \n photosNumber = 0; \n pid = 196997029; \n src = \\"http:/ /cs10609.vkontakte.ru/u79185807/121594781/m_\\";\n \\"src_big \\"= \\"http://cs10609.vkontakte.ru/u79185807/121594781/x_ \\"; \n \\"src_small \\"= \\"http://cs10609.vkontakte.ru/u79185807/121594781/s_ \\"; \n \\"src_xbig \\"= nil; \n \\"src_xxbig \\ "= nil; \n wallRel = \\"0xd42d500 \\"; \n})\n)} \"; \n rate = \" - 19 \"; \n sex = 0; \nstatuses = \" {(\n)} \"; \n timezone = 0; \n uid = 79185807;

Jus*_*ers 33

当您的数据库从两个不同的位置更改,然后从两个不同的位置保存时,有时会导致合并冲突; 在某些情况下,更改可能会影响相同的对象或属性,并且Core Data不会自动覆盖它们,因为这可能会破坏有价值的数据.

有几个选择:

  • 当您收到合并冲突时,请迭代其信息,并根据应用程序的需要手动解决任何冲突.
  • 托管对象上下文的合并策略设置为将自动解决某些类型的冲突的策略.一些合并策略具有部分破坏性,有些非常具有破坏性 - 哪一个是正确的,这取决于您的应用程序以及保存数据的重要性.
  • 使用mergeChangesFromContextDidSaveNotification:快速,紧密地将更改集成到尚未保存的托管对象上下文中.请注意,这可能仍然需要一定程度的冲突解决,但应该有助于最小化严重性.

  • 我遇到的问题是相同的对象,但生活在两个不同的MOC中,它阻止了CD的保存.只需添加mergePolicy即可修复我的保存错误.谢谢! (3认同)

小智 11

简而言之 - 启用合并策略将此添加到您的MOC设置:

客观-C

[_managedObjectContext setMergePolicy:[[NSMergePolicy alloc] initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType]];
Run Code Online (Sandbox Code Playgroud)

迅速

 lazy var managedObjectContext: NSManagedObjectContext? = {

    let coordinator = self.persistentStoreCoordinator
    if coordinator == nil {
        return nil
    }
    var managedObjectContext = NSManagedObjectContext()
    managedObjectContext.persistentStoreCoordinator = coordinator

    //add this line 
    managedObjectContext.mergePolicy = NSMergePolicy(mergeType: NSMergePolicyType.MergeByPropertyObjectTrumpMergePolicyType);

    return managedObjectContext
}()
Run Code Online (Sandbox Code Playgroud)


Nil*_*key 8

我得到了相同的合并冲突,同时保存了上下文.在这里看到苹果医生

我使用NSMergePolicy解决了冲突

- (BOOL)resolveConflicts:(NSArray *)list error:(NSError **)error
Run Code Online (Sandbox Code Playgroud)

NSOverwriteMergePolicyType在创建NSMergePolicy对象时将policyType 设置为

NSOverwriteMergePolicyType:指定在持久存储中覆盖冲突中已更改对象的状态的策略.

`

if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {

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

  NSArray * conflictListArray = (NSArray*)[[error userInfo] objectForKey:@"conflictList"];
  NSLog(@"conflict array: %@",conflictListArray);
  NSError * conflictFixError = nil;

  if ([conflictListArray count] > 0) {

    NSMergePolicy *mergePolicy = [[NSMergePolicy alloc] initWithMergeType:NSOverwriteMergePolicyType];

    if (![mergePolicy resolveConflicts:conflictListArray error:&conflictFixError]) {
      NSLog(@"Unresolved conflict error %@, %@", conflictFixError, [conflictFixError userInfo]);
      NSLog(@"abort");
      abort();
    }
  } }
Run Code Online (Sandbox Code Playgroud)


Vah*_*hid 5

雨燕4

private(set) lazy var mainContext: NSManagedObjectContext = {

    let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    context.parent = privateContext

    context.mergePolicy = NSMergePolicy(merge: .overwriteMergePolicyType)

    // Or we can use Trumping 
    // .mergeByPropertyObjectTrumpMergePolicyType
    // .mergeByPropertyStoreTrumpMergePolicyType

    // Rolling back is another option
    // .rollbackMergePolicyType

    return context
}()
Run Code Online (Sandbox Code Playgroud)