Meilleur entrainement? – Array / Dictionary en tant qu'atsortingbut 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'attributes et j'aimerais savoir quel est le moyen le plus efficace de stocker des données de type tableau / dictionary en tant qu'atsortingbut (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 dictionary / tableau que attributes / champs séparés). Je vous remercie.

    Il n'y a aucun type de tableau ou de dictionary "natif" dans datatables de base. Vous pouvez stocker un NSArray ou un NSDictionary tant qu'atsortingbut transformable. Cela utilisera le NSCoding pour sérialiser le tableau ou le dictionary sur un atsortingbut NSData (et le désérialiser correctement lors de l'access). L'avantage de cette approche est que c'est facile. L'inconvénient est que vous ne pouvez pas interroger le tableau ou le dictionary (il est stocké en tant que BLOB dans le magasin de données) et si les collections sont volumineuses, vous devrez déplacer beaucoup de données vers / depuis le magasin de données (si un magasin de données SQLite) juste pour lire ou modifier une petite partie de la collection.

    L'alternative consiste à utiliser des relations Core-to-many pour modéliser la sémantique de la collection de arrays ou de dictionarys. Les arrays sont plus faciles, alors commençons par ça. Les données Core to-many modélisent vraiment un set, donc si vous avez besoin d'une fonctionnalité de type tableau, vous devez sortinger l'set (en utilisant une propriété récupérée est un moyen pratique de le faire) ou append un atsortingbut index supplémentaire à l'entité qui stocke les éléments du tableau et gère les index vous-même. Si vous stockez un tableau homogène (toutes les inputs sont du même type), il est facile de modéliser la description de l'entité pour les entités du tableau. Si ce n'est pas le cas, vous devrez décider d'utiliser un atsortingbut transformable pour stocker datatables de l'article ou créer une famille d'entités article.

    La modélisation d'un dictionary nécessitera probablement une relation "to-many" avec un set d'entités qui stocke une key et une valeur. La key et la valeur sont toutes deux analogues à l'entité d'élément pour le tableau, décrite ci-dessus. Ils peuvent donc être des types natifs (si vous les connaissez à l'avance), un atsortingbut transformable ou une relation avec une instance d'une famille d'entités spécifiques à un type.

    Si tout cela semble un peu intimidant, c'est le cas. Il est difficile de cataloguer des données arbitraires dans un cadre dépendant d'un schéma comme Core Data.

    Pour datatables structurées, comme les adresses, il est presque toujours plus facile de passer du time à modéliser explicitement les entités (par exemple un atsortingbut pour chaque partie de l'adresse). En plus d'éviter tout code supplémentaire pour modéliser un dictionary, cela rendra votre interface user plus facile (les bindings fonctionneront simplement) et votre logique de validation, etc., beaucoup plus clairement puisqu'une grande partie peut être gérée par Core Data.

    Mettre à jour

    À partir de OS X 10.7, datatables de base include un type de jeu ordonné pouvant être utilisé à la place d'un tableau. Si vous pouvez cibler 10.7 ou plus tard, c'est la meilleure solution pour les collections ordonnées (semblables à des arrays).

    J'ai eu un problème similaire. Dans mon cas, je voulais cartographier un tableau de strings. J'ai suivi le conseil de Barry et j'ai finalement réussi à le faire fonctionner. Voici à quoi ressemble une partie du code (ce qui, espérons-le, clarifiera les choses pour quiconque s'y heurte) …

    Mon Entité ressemble à ceci:

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

    Mon code Gérer le code du model d'object (données de base) ressemble à ceci:

     NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init]; [entityDescription setName:@"AppointmentSearchResponse"]; [entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"]; NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array]; NSAtsortingbuteDescription *messageType = [[NSAtsortingbuteDescription alloc] init]; [messageType setName:@"messages"]; [messageType setAtsortingbuteType:NSTransformableAtsortingbuteType]; [appointmentSearchResponseProperties addObject:messageType]; [entityDescription setProperties:appointmentSearchResponseProperties]; 

    Donc, les éléments keys sont les suivants:

    • J'utilise un NSSet pour le type de propriété
    • J'utilise NSTransformableAtsortingbuteType comme type d'atsortingbut dans le model d'object géré de données de base.