wake-up-neo.com

Beste Übung? - Array / Dictionary als Hauptattribut für Datenentitäten

Ich bin neu bei Core Data. Ich habe festgestellt, dass Auflistungstypen 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). Vielen Dank.

174
RunLoop

In Core Data gibt es keinen "nativen" Array- oder Dictionary-Typ. Sie können ein NSArray oder ein NSDictionary als umwandelbares Attribut speichern. Dies verwendet das NSCoding, um das Array oder Wörterbuch in ein 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 wird als BLOB im Datenspeicher gespeichert). Wenn die Auflistungen groß sind, müssen Sie möglicherweise viele Daten in den/aus dem Datenspeicher verschieben (falls dies der Fall ist) einen SQLite-Datenspeicher), um nur einen kleinen Teil der Sammlung zu lesen oder zu ändern.

Die Alternative besteht darin, Core Data to many-Beziehungen zu verwenden, um die Semantik des Arrays oder der Dictionary-Sammlung zu modellieren. Arrays sind einfacher, also fangen wir damit an. Core Data-to-many-Beziehungen modellieren tatsächlich eine Menge. Wenn Sie also eine Array-ähnliche Funktionalität benötigen, müssen Sie entweder die Menge sortieren (eine abgerufene Eigenschaft ist eine bequeme Möglichkeit, dies zu tun) oder der Entität ein zusätzliches Indexattribut hinzufügen Das speichert die Array-Elemente und verwaltet die Indizes selbst. Wenn Sie ein homogenes Array speichern (alle Einträge sind vom selben Typ), ist es einfach, die Entitätsbeschreibung für die Array-Entitäten zu modellieren. Andernfalls müssen Sie entscheiden, ob Sie ein umwandelbares Attribut zum Speichern der Artikeldaten oder zum Erstellen einer Familie von Artikelentitäten verwenden möchten.

Das Modellieren eines Wörterbuchs erfordert wahrscheinlich eine Zu-Viele-Beziehung zu einer Reihe von Entitäten, in denen ein Schlüssel und ein Wert gespeichert sind. Sowohl der Schlüssel als auch der Wert entsprechen der oben beschriebenen Elemententität für das Array. Es kann sich also entweder um native Typen handeln (sofern Sie diese im Voraus kennen), um ein umwandelbares 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 für die explizite Modellierung der Entitäten zu verwenden (z. B. ein Attribut für jeden Teil der Adresse). Abgesehen davon, dass Sie nicht den gesamten zusätzlichen Code für die Modellierung eines Wörterbuchs benötigen, vereinfacht dies Ihre Benutzeroberfläche (Bindungen funktionieren "nur") und Ihre Validierungslogik usw. erheblich, da ein Großteil davon von Core Data verarbeitet werden kann.

pdate

Ab OS X 10.7 enthält Core Data einen geordneten Settyp, der anstelle eines Arrays verwendet werden kann. Wenn Sie 10.7 oder höher als Ziel festlegen können, ist dies die beste Lösung für geordnete (arrayartige) Sammlungen.

244
Barry Wark

Ich hatte ein ähnliches Problem. In meinem Fall wollte ich eine Reihe von Zeichenfolgen zuordnen. Ich folgte Barrys Rat und brachte ihn schließlich zum Laufen. Hier ist, wie ein Teil des Codes aussieht (der hoffentlich die Dinge für alle anderen klären wird, die darauf stoßen) ...

Meine Entität sieht ungefähr so ​​aus:

@interface AppointmentSearchResponse : NSManagedObject
@property (nonatomic, retain) NSSet *messages;
@end

Mein Code zum Verwalten des Objektmodellcodes (Core Data) sieht ungefähr so ​​aus:

NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init];
[entityDescription setName:@"AppointmentSearchResponse"];
[entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"];

NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array];
NSAttributeDescription *messageType = [[NSAttributeDescription alloc] init];    
[messageType setName:@"messages"];
[messageType setAttributeType:NSTransformableAttributeType];
[appointmentSearchResponseProperties addObject:messageType];

[entityDescription setProperties:appointmentSearchResponseProperties];

Die Schlüsselelemente hier sind also:

  • Ich verwende ein NSSet für den Eigenschaftstyp
  • Ich verwende NSTransformableAttributeType als Attributtyp im Core Data Managed Object Model.
11
caleb