Ich verwende Kerndaten in meiner iPhone-App. Ich habe eine einfache Klasse erstellt Freund die sich ableitet von NSManagedObject und der die folgende Eigenschaft verwendet:
@property (nonatomic, retain) NSString *name;
Ich bin in der Lage, Instanzen dieser Klasse zu meinem Kontext hinzuzufügen und zu löschen, und meine Änderungen sind auch persistent.
Jetzt möchte ich Aktualisieren/Ändern a Freund -Instanz und machen sie wieder persistent.
Aber das scheint nicht zu funktionieren.
Hier ist ein Teil des Codes, der mein Problem zeigt:
// NSManagedObjectContext *context = < my managed context>
// NSFetchedResultsController *nsfrc= < my fetched result controller>
NSEntityDescription *entity = [nsfrc entity];
NSManagedObject *newManagedObject = [NSEntityDescription
insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
Friend *f = (Friend *) newManagedObject;
f.name = @"name1";
//1. --- here context.hasChanges == 1 --- ok
NSError *error = nil;
if (![context save:&error]) { ... }
//2. --- here context.hasChanges == 0 --- ok
f.name = @"name2";
//3. --- here context.hasChanges == 0 --- nok?
if (![context save:&error]) { ... }
Bei Kommentar 1 ist alles in Ordnung. Ich habe eine neue NSManagedObject der Freund -Typ und ich kann die Eigenschaft name ändern. Der Kontext zeigt mir, dass es etwas zu speichern gibt. Nach dem Speichern des Kontexts sehe ich context.hasChanges == 0 . Beachten Sie auch, dass die Daten nach dem Speichern des Kontexts erhalten bleiben.
Nach Kommentar 2 ändere ich die Eigenschaft name. Jetzt würde ich erwarten context.hasChanges == 1 und auch nach der Kontext speichern Ich würde erwarten, dass der neue Name beständig ist. Aber leider ist er das nicht. Wenn ich die Anwendung erneut starte, wird die Freund Instanz mit der name-Eigenschaft = @"name1" .
Ich kann in der Kerndatendokumentation keine Hinweise oder Beispiele finden. Was mache ich also falsch? Was muss ich tun, um eine bestehende Datei zu aktualisieren/ändern? Freund -Instanz zu ändern und sie dauerhaft zu machen?
Die einzige Lösung, die ich sehe, ist, den Eintrag zu löschen, ihn zu ändern und erneut hinzuzufügen. Aber ich glaube nicht, dass dies der richtige Weg ist.
Danke!