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 ..
.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
Welche der 'save' Anrufe in' onTestButton2' verursacht den Fehler? –
Die zweite. Es ist immer nach dem Versuch, Daten nach dem gespeicherten 'Austausch' zu ändern – Fittoburst
Ich kann dies reproduzieren, aber ich weiß wirklich nicht wtf verursacht es. –