175 votes

Meilleur entrainement? - Array / Dictionary en tant qu'attribut d'entité de données de base

Je suis nouveau à Core Data. J'ai remarqué que les types de collection ne sont pas disponibles en tant que types d'attributs et j'aimerais savoir quel est le moyen le plus efficace de stocker des données de type tableau / dictionnaire en tant qu'attribut (par exemple, les éléments constituant une adresse comme rue, ville, etc. ne nécessite pas d'entité distincte et est plus facilement stocké en tant que dictionnaire / tableau que attributs / champs séparés). Je vous remercie.

246voto

Barry Wark Points 73462

Il n'y a pas de "native" de tableau ou de type de dictionnaire dans la Base de Données. Vous pouvez stocker un NSArray ou NSDictionary comme un transformables attribut. Cela permettra d'utiliser l' NSCoding de sérialiser le tableau ou de dictionnaire, à une NSData d'attribut (et de manière appropriée désérialiser lors de l'accès). L'avantage de cette approche est qu'elle est facile. L'inconvénient est que vous ne pouvez pas de requête dans le tableau ou un dictionnaire (il est stocké sous forme d'un BLOB dans le magasin de données) et, si les collections sont grandes, vous pourriez avoir à déplacer un grand nombre de données vers/à partir de la banque de données (si c'est une banque de données SQLite) pour lire ou modifier une petite partie de la collection.

L'alternative est d'utiliser des Données de Base à de nombreuses relations de modéliser la sémantique de la matrice ou de la collection de dictionnaires. Les tableaux sont plus faciles, donc permet de commencer avec ça. Données de base à de nombreuses relations sont vraiment la modélisation d'un jeu, donc si vous avez besoin de la matrice de fonctions de type, vous devez soit de tri de l'ensemble (à l'aide d'un extraites de la propriété est un moyen pratique de faire cela) ou d'ajouter un attribut index de l'entité qui stocke les éléments de tableau et de gérer les index vous-même. Si vous stockez une homogène array (toutes les entrées sont du même type), il est facile de modèle de l'entité description de la matrice des entités. Si non, vous aurez à décider si vous souhaitez utiliser un transformables attribut de stocker l'élément de données ou de créer une famille d'élément entités.

Modélisation d'un dictionnaire sera probablement besoin d'une relation à un ensemble d'entités qui stocke une clé et une valeur. À la fois la clé et la valeur sont analogues à ceux de l'élément de l'entité pour le tableau décrit ci-dessus. De sorte qu'ils pourraient être de types natifs (si vous les connaissez à l'avance), un transformables attribut ou une relation à une instance à partir d'une famille de type-entités spécifiques.

Si tout cela semble un peu intimidant, il est. Shoehorning de données arbitraires dans un schéma dépendant de cadre comme Base de Données est difficile.

Pour les données structurées, comme les adresses, il est presque toujours plus facile de passer le temps à la modélisation des entités explicitement (par exemple, un attribut pour chaque partie de l'adresse). D'ailleurs en évitant tous les code supplémentaire pour modèle un dictionnaire, ce qui rend votre INTERFACE utilisateur plus facile (liaisons "travail") et votre logique de validation, etc. beaucoup plus clair, car pour l'essentiel, il peut être manipulé par la Base de Données.

Mise à jour

Comme de OS X 10.7, Base de Données comprend un ensemble ordonné de type qui peut être utilisé à la place d'un tableau. Si vous pouvez cibler 10.7 ou plus tard, c'est la meilleure solution pour commandé (array) des collections.

11voto

caleb Points 586

J'ai eu un problème similaire. Dans mon cas, je voulais une carte, un tableau de chaînes de caractères. J'ai suivi Barry conseils et a finalement obtenu ce travail. Voici ce que certains d'ressemble le code (qui nous l'espérons clarifier les choses pour quelqu'un d'autre qui s'exécute dans cette)...

Mon Entité ressemble à quelque chose comme ceci:

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

Mon Gérer le Code du Modèle Objet (Base de Données) code ressemble à ceci:

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];

Donc, les éléments clés sont les suivants:

  • Je suis à l'aide d'un NSSet pour le type de propriété
  • Je suis en utilisant NSTransformableAttributeType que le type d'attribut dans la Base de Données Gérée Modèle d'Objet.

0voto

landonandrey Points 64

Regardez celui-ci : http://www.lextech.com/2013/01/core-data-transformable-attributes/

Il fonctionne très bien pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X