2009-10-25 10 views
9

Ich arbeite an einer Anwendung, die eine Suche nach einem Online-Service durchführen und viele Ergebnisobjekte generieren wird. Ein Result-Objekt ist ein NSManagedObject, das nach Bedarf initialisiert wird, indem es mit einem NSManagedObjectContext verknüpft wird.Wie erstelle ich viele temporäre Objekte und speichere dann nur eines mit Core Data?

Benutzer sollten in der Lage sein, ein "Ergebnis" auszuwählen und es als "Favorit" zu speichern. In der Anwendung ist dies so einfach wie das Verknüpfen der Result-Entität mit einer neuen Favorite-Entität und das Speichern des Kontextes.

Das Problem ist, dass jedes einzelne Ergebnis im Kontext natürlich in der Datenbank zusammen mit der gewünschten Favorit gespeichert wird.

Ich habe viele Beispiele für die Verwendung mehrerer NSManagedObjectContext-Instanzen zur Verwaltung verschiedener Erstellungs- und Persistenzsituationen gesehen. Sie alle scheinen sich um die Idee zu drehen, neue Instanzen mit einem Kontext zu erstellen und sie dann in einem anderen Kontext zu speichern, um eine andere FetchRequest-Ausführung zu vermeiden. Diese Beispiele lösen das Problem nicht, da sie immer noch dazu führen, dass jede Ergebniseinheit gespeichert wird.

Hat jemand irgendwelche Vorschläge? Ich bin total angetan davon.

Antwort

5

Sie sollten für jedes Objekt einen anderen Kontext verwenden. Wenn Sie einen separaten Kontext für verwaltete Objekte verwenden, können Sie wie folgt arbeiten. Wenn der Benutzer sein Lieblingsobjekt auswählt, verwerfen Sie einfach die Kontexte, die sich auf die verbleibenden Ergebnisobjekte beziehen. Keine Notwendigkeit, Änderungen usw. zusammenzuführen. Es gibt grundsätzlich einen Kompromiss. Sie verwalten (erstellen/löschen) mehrere Kontexte, aber dann erreichen Sie leicht Ihr Ziel. Andernfalls können Sie dies immer noch mit nur einem einzigen Kontext tun. Sie müssen jedoch jedes Objekt explizit einfügen oder löschen, wie in den folgenden Codefragmenten gezeigt.

Versuchen Sie es. Nur für das Lieblingsobjekt, das Sie wie folgt vor speichern möchten:

[managedObjectContext insertObject:theFavorite]; 

Für jede der anderen Ergebnisobjekten tun dies statt:

[managedObjectContext deleteObject:aResult]; 

speichern Sie dann wie gewohnt

NSError *error = nil 
if (![managedObjectContext save:&error]) { 
    // Handle error 

} 

Dadurch wird NUR Ihr ausgewähltes Lieblingsobjekt gespeichert.

+0

Wir gingen mit dem ersten Teil Ihrer Antwort. Wir verwenden einen Kontext pro Objektgraph und speichern diesen nach Bedarf. – user174448

3

Erstellen Sie Ergebnisobjekte, die keine NSManagedObject-Unterklassen sind. Wenn der Benutzer einen auswählt, erstellen Sie eine einzelne verwaltete Instanz und speichern Sie diese.

+0

Ich vereinfachte das Problem aus Gründen der Kürze. Das Result-Objekt ist eine Entität mit vielen Eigenschaften und mehreren Beziehungen. Der Gedanke, die Klassen zu duplizieren, bringt mich in den Mund :) – user174448

4

Ich bevorzuge die Verwendung eines NIL-Kontexts und habe eine Basisdomänenmodellklasse, um Objekte rekursiv zu einem gültigen Kontext hinzuzufügen, wenn ich sie beibehalten möchte. Es funktioniert wirklich schön (und sauber!) ... Code hier verfügbar ... Temporary Core Data

+0

Dies ist die gute Lösung für temporäre Objekte. Was passiert jedoch, wenn Sie ein Objekt der Beziehung hinzufügen, die * einen * Kontext hat? Was ist der beste Ansatz hier? –

+0

Siehe auch diese Frage: http://stackoverflow.com/questions/3256195/how-to-deal-withtemporary-nsmanagedobject-instances – Symmetric

Verwandte Themen