¿Mejores prácticas? – Matriz / Diccionario como atributo de entidad de datos básicos

Soy nuevo en Core Data. He notado que los tipos de colección no están disponibles como tipos de atributos y me gustaría saber cuál es la forma más eficiente de almacenar los datos del tipo de matriz / diccionario como un atributo (por ejemplo, los elementos que componen una dirección como calle, ciudad, etc. no requiere una entidad separada y se almacena de manera más conveniente como un diccionario / matriz que atributos / campos separados). Gracias.

No hay una matriz “nativa” o tipo de diccionario en Datos principales. Puede almacenar un NSArray o un NSDictionary como un atributo transformable. Esto utilizará NSCoding para serializar la matriz o el diccionario en un atributo NSData (y deserializarlo adecuadamente al acceder). La ventaja de este enfoque es que es fácil. La desventaja es que no puede consultar en la matriz o el diccionario (se almacena como un BLOB en el almacén de datos) y si las colecciones son grandes, es posible que tenga que mover una gran cantidad de datos hacia / desde el almacén de datos (si es un almacén de datos SQLite) solo para leer o modificar una pequeña parte de la colección.

La alternativa es utilizar Core Data to-many relaciones para modelar la semántica de la matriz o colección de diccionarios. Las matrices son más fáciles, entonces comencemos con eso. Las relaciones de Core to-many realmente modelan un conjunto, por lo que si necesita funcionalidad similar a una matriz, debe ordenar el conjunto (usar una propiedad de búsqueda es una forma conveniente de hacerlo) o agregar un atributo de índice adicional a la entidad que almacena los elementos de la matriz y administra los índices usted mismo. Si está almacenando una matriz homogénea (todas las entradas son del mismo tipo), es fácil modelar la descripción de la entidad para las entidades de la matriz. De lo contrario, deberá decidir si utiliza un atributo transformable para almacenar los datos del elemento o crear una familia de entidades de elementos.

El modelado de un diccionario probablemente requerirá una relación de muchos a un conjunto de entidades que almacena una clave y un valor. Tanto la clave como el valor son análogos a la entidad del elemento para la matriz, descrita anteriormente. Por lo tanto, podrían ser tipos nativos (si los conoce con anticipación), un atributo transformable o una relación con una instancia de una familia de entidades específicas de tipo.

Si todo esto suena un poco desalentador, lo es. Astackr datos arbitrarios en un marco dependiente del esquema como Core Data es difícil.

Para datos estructurados, como direcciones, es casi siempre más fácil pasar el tiempo modelando las entidades explícitamente (por ejemplo, un atributo para cada parte de la dirección). Además de evitar todo el código adicional para modelar un diccionario, esto hace que su UI sea más fácil (los enlaces “simplemente funcionen”) y su lógica de validación, etc. mucho más clara, ya que gran parte de ella puede ser manejada por Core Data.

Actualizar

A partir de OS X 10.7, Core Data incluye un tipo de conjunto ordenado que se puede utilizar en lugar de una matriz. Si puede orientar 10.7 o posterior, esta es la mejor solución para colecciones ordenadas (tipo array).

Tuve un problema similar. En mi caso, quería mapear una serie de cadenas. Seguí el consejo de Barry y finalmente lo hice funcionar. A continuación, se muestra el aspecto del código (que con suerte aclarará las cosas para cualquier otra persona que se encuentre con esto) …

Mi Entidad se ve algo como esto:

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

Mi código de Manage Object Model Code (Core Data) se ve más o menos así:

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

Entonces, los elementos clave aquí son:

  • Estoy usando un NSSet para el tipo de propiedad
  • Estoy usando NSTransformableAttributeType como el tipo de atributo en el Modelo de Objetos Administrado por Datos Básicos.