In Core Data gibt es keinen "nativen" Array- oder Wörterbuchtyp. Sie können ein NSArray
oder ein NSDictionary
als transformierbares Attribut speichern . Dies wird verwendet, NSCoding
um das Array oder Wörterbuch zu einem NSData
Attribut zu serialisieren (und es beim Zugriff entsprechend zu deserialisieren). Der Vorteil dieses Ansatzes ist, dass es einfach ist. Der Nachteil ist, dass Sie das Array oder Wörterbuch nicht abfragen können (es ist als BLOB im Datenspeicher gespeichert). Wenn die Sammlungen groß sind, müssen Sie möglicherweise viele Daten in den / aus dem Datenspeicher verschieben (falls dies der Fall ist) ein SQLite-Datenspeicher), um nur einen kleinen Teil der Sammlung zu lesen oder zu ändern.
Die Alternative besteht darin, Kerndaten-zu-viele-Beziehungen zu verwenden, um die Semantik des Arrays oder der Wörterbuchsammlung zu modellieren. Arrays sind einfacher, also fangen wir damit an. Core-Data-to-Many-Beziehungen modellieren eine Menge wirklich. Wenn Sie also eine Array-ähnliche Funktionalität benötigen, müssen Sie entweder die Menge sortieren (eine bequeme Eigenschaft ist eine bequeme Methode, um dies zu tun) oder der Entität ein zusätzliches Indexattribut hinzufügen Dadurch werden die Array-Elemente gespeichert und die Indizes selbst verwaltet. Wenn Sie ein homogenes Array speichern (alle Einträge sind vom gleichen Typ), ist es einfach, die Entitätsbeschreibung für die Array-Entitäten zu modellieren. Wenn nicht, müssen Sie entscheiden, ob Sie ein transformierbares Attribut zum Speichern der Artikeldaten verwenden oder eine Familie von Artikelentitäten erstellen möchten.
Das Modellieren eines Wörterbuchs erfordert wahrscheinlich eine zu viele Beziehungen zu einer Reihe von Entitäten, in denen ein Schlüssel und ein Wert gespeichert sind. Sowohl Schlüssel als auch Wert sind analog zu der oben beschriebenen Elemententität für das Array. Es kann sich also entweder um native Typen handeln (wenn Sie sie im Voraus kennen), um ein transformierbares Attribut oder um eine Beziehung zu einer Instanz aus einer Familie typspezifischer Entitäten.
Wenn das alles ein bisschen entmutigend klingt, ist es das auch. Es ist schwierig, beliebige Daten in ein schemaabhängiges Framework wie Core Data zu integrieren.
Bei strukturierten Daten wie Adressen ist es fast immer einfacher, die Zeit damit zu verbringen, die Entitäten explizit zu modellieren (z. B. ein Attribut für jeden Teil der Adresse). Dies vermeidet nicht nur den zusätzlichen Code zum Modellieren eines Wörterbuchs, sondern erleichtert auch Ihre Benutzeroberfläche (Bindungen funktionieren "nur") und Ihre Validierungslogik usw. viel klarer, da ein Großteil davon von Core Data verarbeitet werden kann.
Aktualisieren
Ab OS X 10.7 enthält Core Data einen geordneten Satztyp, der anstelle eines Arrays verwendet werden kann. Wenn Sie auf 10.7 oder höher abzielen können, ist dies die beste Lösung für geordnete (Array-ähnliche) Sammlungen.