2013-10-29 7 views
6

Ich habe Probleme mit einer einfachen Datensicherung in einer Single-Thread-App, nachdem zwei Zeilen neu geordnet wurden.iOS7 NSMergeConflict bei Single Thread Speichern

Ich habe es geschafft, die Codierung zu vereinfachen, um den Fehler zu reproduzieren, und würde mich über eine zweite Meinung mit jemand anderem freuen, der das ausprobiert.

Dies ist eine Plausibilitätsprüfung, wie ich bin einer Kern-Datenproblem eingeführt mit iOS 7 verdächtig wie dies in iOS 6. Zum einen

ok gearbeitet, ein neues Kerndaten Projekt starten und dieses Modell erstellen ..

.

simple core data model

Attribut 'aktuelle' ist ein optionaler boolean. Die Eins-zu-viele-Beziehung ist eine geordnete Beziehung, die ein NSOrderedDataset erstellt.

Jetzt fügen Sie ein paar Knöpfe zur App hinzu; der erste, um die Daten zu erstellen (ein Projekt und zwei verknüpfte 'Zeichnungen') und der zweite, um die zwei Zeichnungen zu tauschen, dann legen Sie eine Eigenschaft innerhalb der ersten Zeichnung fest.

Hier ist der Code ...

-(IBAction)onTestButton:(id)sender 
{ 
    id delegate = [[UIApplication sharedApplication]delegate]; 
    NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext]; 

    self.project = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:managedObjectContext]; 
    Drawing *drawing1 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext]; 
    Drawing *drawing2 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext]; 

    NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.project.drawings]; 
    [tempSet addObject:drawing1]; 
    [tempSet addObject:drawing2]; 
    self.project.drawings = tempSet; 

    [self save]; 
} 

-(IBAction)onTestButton2:(id)sender 
{ 
    NSMutableOrderedSet *exchange = [self.project mutableOrderedSetValueForKey:@"drawings"]; 
    [exchange exchangeObjectAtIndex:0 withObjectAtIndex:1]; 
    self.project.drawings = exchange; 

    [self save]; 

    Drawing *drawing = [self.project.drawings objectAtIndex:0]; 

    BOOL current = [drawing.current boolValue]; 
    drawing.current = [NSNumber numberWithBool:!current]; 

    [self save]; 
} 

-(void)save 
{ 
    id delegate = [[UIApplication sharedApplication]delegate]; 
    NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext]; 
    NSError *error = nil; 

    if(![managedObjectContext save:&error]) 
    { 
     NSLog(@"%@ Save: Unresolved Error on Save %@", error, [error userInfo]); 
     abort(); 
    } 
} 

Nun Test durch die erste Test-Taste drücken. Dies richtet die Daten ein.

Dann drücken Sie den zweiten Testknopf .... alles OK !!!

Drücken Sie nun die zweite Testtaste erneut und BANG. Sie ‚sollte ein NSMergeConflict Fehler wie diese erhalten ....

Save: Ungelöste Fehler beim Speichern { conflictList = ( „NSMergeConflict (0x8a7d0b0) für NSManagedObject (0x8bedfa0) mit objectID '0x8bd9340 ' mit oldVersion = 1 und newVersion = 2 und altes Objekt snapshot = {
current = \ "\"; \ n project = \ "0x8bc3f50 \"; \ n} und neue zwischengespeicherte Zeile = {\ n current = \ "\"; \ n project = "0x8aa88c0 "; \ n} " );

Ich merke von dem Fehler, dass mein Projektobjekt geändert hat. Dies ist jedoch eine Single-Thread-App, die den Haupt-App-Kontext verwendet.

Ich habe viel zu lange damit verbracht und wäre dankbar für jemand anderen, der einen Kommentar darüber gibt, wo das Problem liegt. Ist das ein Kerndatenfehler oder bin ich ein richtiger "Narr"?

Vielen Dank

/Fitto

+0

Welche der 'save' Anrufe in' onTestButton2' verursacht den Fehler? –

+0

Die zweite. Es ist immer nach dem Versuch, Daten nach dem gespeicherten 'Austausch' zu ändern – Fittoburst

+0

Ich kann dies reproduzieren, aber ich weiß wirklich nicht wtf verursacht es. –

Antwort

9

Ich hatte ähnliche Probleme ein fand eine Abhilfe hier:

http://prod.lists.apple.com/archives/cocoa-dev/2013/Oct/msg00657.html

Kurz gesagt - fügen Sie diese zu Ihrer MOC-Setup:

[_managedObjectContext setMergePolicy:[[NSMergePolicy alloc] initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType]]; 

Dies betrifft OS X 10.9 Mavericks ebenso l wenn NSSQLStoreType verwendet wird.Ich konnte den Merge-Fehler nicht mit NSXMLStoreType wiederholen.

Für Swift 2.x

managedObjectContext.mergePolicy = NSMergePolicy(mergeType: .MergeByPropertyObjectTrumpMergePolicyType) 
+0

Danke, ja das behebt es. Puh! Nicht sicher, warum es passiert. Ich kann nur annehmen, dass Core-Daten hinter den Kulissen "unsichtbare" Purzelbäume ausführen. – Fittoburst

+0

Ich verstehe nicht wirklich warum, aber das schien mein Absturzproblem mit AFIncrementalStore zu beheben. Tausend Dank! Debuggen seit Tagen. – lari

+0

Phewww ... Danke, dass du mein Leben gerettet hast :) – GKK

Verwandte Themen