Ich bin neu bei Core Data. Ich habe festgestellt, dass Sammlungstypen nicht als Attributtypen verfügbar sind, und möchte wissen, wie Array- / Wörterbuchtypdaten am effizientesten als Attribut gespeichert werden können (z. B. die Elemente, aus denen eine Adresse wie Straße, Stadt usw. besteht) erfordern keine separate Entität und werden bequemer als Wörterbuch / Array gespeichert als separate Attribute / Felder). Danke dir.
objective-c
ios
core-data
nsarray
nsdictionary
RunLoop
quelle
quelle
Antworten:
In Core Data gibt es keinen "nativen" Array- oder Wörterbuchtyp. Sie können ein
NSArray
oder einNSDictionary
als transformierbares Attribut speichern . Dies wird verwendet,NSCoding
um das Array oder Wörterbuch zu einemNSData
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.
quelle
Ich hatte ein ähnliches Problem. In meinem Fall wollte ich eine Reihe von Zeichenfolgen zuordnen. Ich folgte Barrys Rat und brachte es endlich zum Laufen. Hier ist, wie ein Teil des Codes aussieht (was hoffentlich die Dinge für alle anderen klären wird, die darauf stoßen) ...
Mein Wesen sieht ungefähr so aus:
Mein Code zum Verwalten des Objektmodellcodes (Kerndaten) sieht ungefähr so aus:
Die wichtigsten Punkte hier sind also:
quelle