2009-09-28 7 views
8

Gibt es eine Möglichkeit, ein verwaltetes Objekt außerhalb eines Kontexts zu initialisieren. Ich versuche grundsätzlich, ein verwaltetes Objekt zuerst außerhalb eines Kontextes zuzuordnen, dann herauszufinden, ob ich das Objekt wirklich einfügen möchte, und es dann unter Verwendung eines vorhandenen verwalteten Objektkontexts in den Datenspeicher zu injizieren.iPhone Core Data: Initialisieren des verwalteten Objekts ohne Kontext

Ist dies möglich oder verstößt es gegen die beabsichtigte Verwendung von Core Data?

Antwort

5

Verwaltete Objekte werden vom Kontext "verwaltet", daher können Sie sie nicht mit alloc instanziieren, da sie nicht dazu gedacht sind. Die Instanziierung eines verwalteten Objekts durch den Kontext bleibt jedoch so lange bestehen, bis Sie die Methode save aufrufen Kontext, so haben Sie den gleichen Effekt mit dem Kontext, um es zu installieren und nur speichern, nachdem Sie herausfinden, dass Sie wirklich das Objekt verwenden möchten. Kein

+0

Ich dachte so viel, wollte nur bestätigen, dass dies der Fall war. Danke, Daniel. – WillF

2

, man kann nicht instanziiert ein NSManagedObject instsance außerhalb eines NSManagedObjectContext (na ja, Sie können, aber schlechte Dinge passieren und das Programm wird mit ziemlicher Sicherheit nicht funktionieren, wie Sie gehofft hatte). Sie können jedoch eine NSInMemoryPersistentStore -backed NSManagedObjectContext erstellen. Es ist etwas mehr Setup (nicht viel) und alles verschwindet, wenn Sie den In-Memory-Speicher freigeben. In der Zwischenzeit erhalten Sie alle Vorteile der Object Graph-Verwaltung von Core Data.

0

Worauf Sie wahrscheinlich schießen, ist mehrere Kontexte. Sie können einen zusätzlichen "Notizblock" -Kontext erstellen und dann alle Änderungen wieder in den Hauptkontext einfügen. Eines der iPhone-Beispielprojekte von Apple führt genau das aus. Sie müssen sich im Dev-Center anmelden, um es zu finden.

1

Für alle, die auf diese Frage stolpert, ist hier, wie ich erreicht, was die OP wahrscheinlich würde:

NSManagedObjectContext *moc = AppDelegate.managedObjectContext; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyModel" 
    inManagedObjectContext:moc]; 
MyModel *model = [[MyModel alloc] initWithEntity:entity 
    insertIntoManagedObjectContext:nil]; 
+1

Ich würde vorsichtig sein, dies zu verwenden, wenn die MOCs mit etwas anderem als dem Standard NSConfinementConcurrencyType - NSPrivateQueueConcurrencyType oder NSMainQueueConcurrencyType erstellt werden, kann dazu führen, dass Probleme mit Eigenschaften – stevesliva

+0

Nicht 'wakeFromInsert' wird nicht aufgerufen! – stevesliva

+0

'' 'awakeFromInsert''' wird aufgerufen, wenn Sie es später über' '[[moc insertObject: model];' ' – etipton

Verwandte Themen