2010-11-18 8 views
5

Ich habe eine dokumentbasierte Core Data-Anwendung, die so funktioniert wie sie ist. Ich möchte Unterstützung für einen globalen dauerhaften Speicher hinzufügen, um eine Bibliothek von Elementen zu halten.Document-Based-Anwendung für Kerndaten mit globalem beständigen Speicher

Ich habe die meisten relevanten Dokumente gelesen und verstehe, dass ich Konfigurationen in den verwalteten Objektmodellen verwenden sollte. Ich habe zwei Konfigurationen definiert: "DocumentConfiguration" und "LibraryConfiguration". Die Entitäten in der Dokumentkonfiguration befinden sich nur in der Dokumentkonfiguration, und die Entitäten in der Bibliothekskonfiguration befinden sich nur in der Bibliothekskonfiguration - d. H. Keine Überlappung.

Die Dokumentation sagt dann "Sie verwenden dieses Modell dann, wenn Sie einen Koordinator erstellen". Aber ich erstelle meinen eigenen permanenten Speicherkoordinator nicht wirklich, da ich den standardmäßigen NSPersistentDocument-Koordinator verwende.

Ein paar Fragen über die besten, wie ich haben könnte, um fortzufahren und zu helfen, Missverständnisse aufklären:

A. Würde ich die NSPersistentStoreCoordinator im NSPersistentDocument erhalten und dann einen neuen persistenten Speicher, um es entlang der Linien von:

NSPersistentStoreCoordinator * coordinator = [[myDocument managedObjectContext] persistentStoreCoordinator]; 
[coordinator addPersistentStoreWithType:NSXMLStoreType 
    configuration:@"LibraryConfiguration" 
    URL:url 
    options:nil 
    error:&error]; 

ich denke, dass dies ein Problem sein kann, weil ich nicht die andere Konfigurationsdefinition („DocumentConfiguration“) in der NSPersistentDocument der persistenten Speicher Koordinator zur Verfügung gestellt habe, als ich den von NSPersistentDocument bereitgestellten Standard bin mit. Ich nehme an, es würde wahrscheinlich Null verwenden, wenn die Zeit gekommen ist, das Dokument zu speichern. Und wenn ja, wäre das ein Problem? D.h., wie würde der Koordinator wissen, welcher persistente Speicher eine Entität mit einer gegebenen Konfigurationsdefinition speichern soll, wenn dieselben Konfigurationen nicht für alle persistenten Speicher definiert sind (in diesem Fall zwei)? Kann ich die Konfiguration (auf "DocumentConfiguration") des persistenten Speichers von NSPersistentDocument festlegen, bevor er erstellt/gespeichert wurde? Aus den NSPersistentDocument docs:

Saving a new document adds a store of the default type with the chosen URL and invokes save: on the context. For an existing document, a save just invokes save: on the context.

B. Wäre es besser, meine eigenen NSPersistentStoreCoordinator und NSManagedObjectContext Instanzen zu erstellen, die Addition der beiden persistent speichert mit Konfigurationen definiert und dann die NSPersistentDocument diese NSPersistentStoreCoordinator und NSManagedObjectContext Instanzen verwenden machen, und kostenlos die Alten? Wenn ja, wie würde ich die URL für das NSPersistentDocument für die Methode addPersistentStoreWithType: ... angeben? Es scheint, dass diese URL nur bekannt ist, wenn das unbenannte Dokument gespeichert wurde. (Dies wird getestet, es scheint keinen temporären persistenten Speicher zu geben (über die Methode persistantStores im persistenten Speicherkoordinator), bis das Dokument zum ersten Mal gespeichert wird.

C. Oder wäre es besser, NSPersistentDocument alleine zu lassen und meine eigene NSPersistentStoreCoordinator-Instanz zu erstellen, die ich ausschließlich für das Bibliotheksobjekt des persistenten Bibliotheksspeichers und des verwalteten Bibliotheksobjekts verwende? Die Dokumentation besagt, dass mehrere Instanzen von NSPersistentStoreCoordinator in Multithread-Core Data-Anwendungen verwendet werden sollten, aber ich benötige keine Unterstützung für Multithread-Core-Daten. Ist es wünschenswert, zwei Instanzen von NSPersistentStoreCoordinator zu haben - einen für die Bibliothek und einen für Dokumente (Intuition sagt, dass dies nicht notwendig und wahrscheinlich nicht der richtige Ansatz ist)?

Irgendwelche Vorschläge?

Antwort

1

Die Lösung, die ich verwendete, die gut funktioniert, basiert auf C) oben. Ich belasse das NSPersistentDocument und dessen persistenten Speicherkoordinator allein und erstelle stattdessen meine eigene NSPersistentStoreCoordinator-Instanz, die ich ausschließlich für den persistenten Bibliotheksspeicher (globalen Speicher) verwende.

Ich kann die Konfiguration für den Speicher auf einen benutzerdefinierten Wert festlegen, falls ich später mehrere Speicher diesem permanenten Speicherkoordinator zuordnen möchte (z. B. "LibraryConfiguration"). Da der Bibliotheksspeicher von einem Persistent-Speicherkoordinator verwaltet wird, der sich vom Persistent-Store-Koordinator von NSPersistentDocument unterscheidet, muss ich mich nicht darum kümmern, eine Konfiguration für die persistenten Speicher des NSPersistentDocument anzugeben.

0

Sie müssen für jede Konfiguration einen separaten persistenten Speicher erstellen. Mit dieser Konfiguration können Sie verschiedene Entitäten im selben Datenmodell in separaten persistenten Dateien speichern.

Ein häufiger Fehler hier ist zu vergessen, dass ein persistenter Speicherkoordinator eine beliebige Anzahl persistenter Speicher haben kann.Sie müssen lediglich das Apple-Muster kopieren, um zwei persistente Speicher mit unterschiedlichen Namen und/oder Positionen zu erstellen, die jeweils einen anderen Konfigurationsnamen haben. Fügen Sie dann beide zum beständigen Speicherkoordinator hinzu.

Und Sie sind fertig. Die Entitätsinstanzen für jede Konfiguration gehen in den richtigen Speicher.

+0

Die Dokumentation für NSManagedObjectContext enthält jedoch nur Methoden zum Abrufen/Festlegen des persistenten Speicherkoordinators, nicht zum Hinzufügen eines. Das heißt, Sie können nicht mehr als einen beständigen Speicherkoordinator mit einem verwalteten Objektkontext verknüpfen. (Der permanente Speicherkoordinator, der einem Kontext für verwaltete Objekte zugeordnet ist, kann mehrere persistente Speicher verwalten, aber das ist anders). – Dalmazio

+0

Entschuldigung, ich habe falsch geschrieben. Mit 'addPersistentStoreWithType 'fügen Sie die mehreren Speicher tatsächlich dem persistenten Speicherkoordinator hinzu: configuration: URL: options: error:' – TechZen

+0

Okay, aber es gibt immer noch das Problem für diese Situation (die Integration eines globalen persistenten Speichers und des Speichers eines dokumentenbasierten Anwendung) des Aufrufs von addPersistentStoreWithType: ... auf dem Persistent-Store-Koordinator von NSPersistentDocument, wie in A) oben beschrieben. – Dalmazio