CoreData nicht erfüllen konnte, eine Schuld, wenn Objekte aktualisiert werden, indem HTTP-service
Ich glaube, ich verstehe die Fehlermeldung: CoreData nicht erfüllen konnte, eine Schuld, aber ich bin nicht sicher, wie ich damit umgehen soll.
Wir haben eine Anwendung, wo wir Core-Daten zu bestehen zurückgegebenen Daten aus einer JSON-service. Heute mache ich die folgenden.
- Holen lokales Objekt vom persistenten Speicher und zurück zu UI
- Bitten den server, wenn das Objekt aktualisiert wird, wenn ich die Antwort bekommen, ich update den Core Data verwalteten Objekt
- Update UI mit dem aktualisierten Objekt
Das problem ist; auch wenn ich nicht mit mehreren threads, die ich manchmal zu einem Fehler kommt, wenn der HTTP-request löscht verwaltete Objekte, die meine Benutzeroberfläche beibehalten hat. Ich habe versucht, um die Objekte abzurufen, die mit returnsObjectsAsFaults KEINE. Ich dachte, ich könnte dann den Zugriff auf alle Beziehungen und Eigenschaften eines verwalteten Objekts, auch wenn es gelöscht wurde (so lang wie mein UI behalten hatte).
Wie soll ich dieses Problem lösen?
Dachte ich, ich könnte mit separaten NSManagedObjectContext für Lesen und schreiben. Ich habe an diesem test:
MyAuthorMO *authorUpdate = [[MyAuthorMO alloc] init]; //I have made this init insert the object into the updateContext
authorUpdate.firstname = @"Hans";
authorUpdate.lastname = @"Wittenberg";
authorUpdate.email = @"[email protected]";
NSManagedObjectContext *updateContext = [[MyCoreManager getInstance] managedObjectContext];
NSError *error = nil;
[updateContext save:&error];
NSManagedObjectContext *readContext = [[MyCoreManager getInstance] readOnlyContext];
NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"authorByEmail" substitutionVariables:[NSDictionary dictionaryWithObject:@"[email protected]" forKey:@"EMAIL"]];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSArray *authors = [readContext executeFetchRequest:fetchRequest error:&error];
MyAuthorMO * readAuthor = [authors objectAtIndex:0];
//Delete the author with update context:
[updateContext deleteObject:authorUpdate];
[updateContext save:&error];
NSLog(@"Author: %@ %@, (%@)", readAuthor.firstname, readAuthor.lastname, readAuthor.email);
Log ausgegeben wird nur gut, solange ich die readContext für den fetch. Wenn ich die updateContext für die Holen, bekomme ich eine exception. Das sieht vielversprechend aus, aber ich fürchte, dass ich Probleme in einer späteren Phase. Früher oder später werde ich wahrscheinlich versuchen, auf eine Eigenschaft zuzugreifen, die nicht abgeholt vollständig (ein Fehler). Wie kann ich erreichen, das Verhalten, die ich Suche?
InformationsquelleAutor Andi | 2010-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht behalten verwaltete Objekte, die den Kontext veröffentlicht hat. Lassen Sie uns den Kontext für Sie tun.
Das problem ist, dass die verwalteten Objekte vorhanden sein können, entweder als Fehler oder aktualisierte Objekte. Wenn Sie halten, können Sie behalten die Störung, die keine Daten enthält. Auch wenn Sie tun, behalten Sie das eigentliche Objekt, ist das Objekt möglicherweise nicht ordnungsgemäß Verhalten, wenn es getrennt von seinem Kontext.
Im Umgang mit dem Szenario, Sie brauchen einen Kontext für die UI und dann einen Kontext für den server. Entweder nach dem Kontext ändert, sollten Sie die merge-Kontext zu gewährleisten, werden ordnungsgemäß aktualisiert, relativ zu den lagern.
Ihre Benutzeroberfläche sollte so konfiguriert werden, geben den Stand der Daten zu Modell, Sie sollten nicht Teile des Datenmodells abhängig vom Zustand des UI.
Ich war bisher unklar. Ich meinte man sollte nicht versuchen, zu behalten ein verwaltetes Objekt, das ein Zusammenhang hat, entsorgt. Das wird chaotisch. Sollten Sie merge-Rahmen, aber Sie müssen, um das einfrieren der Benutzeroberfläche, während die Modell-updates. Schauen Sie, wie der NSFetchedResultsController behandelt genau dieses problem mit der Aktualisierung von Daten, während die Daten in einer Tabelle angezeigt. Das einfrieren der UI ist in der Regel völlig unbemerkt vom Benutzer. Wenn Sie Daten haben, die möglicherweise gelöscht werden, während der Benutzer mit ihm arbeitet, müssen Sie überdenken Ihren Entwurf. Der Benutzer sollte die Kontrolle über solche Löschungen.
InformationsquelleAutor TechZen
Ich hatte das gleiche problem in meiner Datenbank, da beziehe ich mich zum Objekt, die nicht existieren (weil ich Entferne es mit anderen relationed Objekt). Meine Lösung war, um eingestellt "Keine Maßnahmen" in meiner Beziehung.
InformationsquelleAutor edzio27