core data - unidad - Almacene NSArray en el código de muestra de datos básicos?
unidad de muestreo ejemplo (5)
He estado buscando un código de ejemplo sobre cómo almacenar un NSArray
en Core Data por un tiempo, pero no he tenido suerte. ¿Alguien me importaría señalarme algún tutorial o ejemplo, o mejor aún, escribir una muestra simple como respuesta a esta pregunta? He leído this pero no muestra un ejemplo de cómo implementar un atributo transformable que es un NSArray
. ¡Gracias por adelantado!
Core Data almacena instancias de NSManagedObject o subclases de las mismas. NSManagedObject en sí mismo es muy parecido a un diccionario. Para muchas relaciones entre objetos se representan como conjuntos. Core Data no tiene una lista ordenada que corresponda a una matriz. En cambio, cuando recupera objetos de un almacén de datos centrales, utiliza una solicitud de búsqueda. Esa solicitud de obtención puede especificar uno o más descriptores de clasificación que se utilizan para ordenar los objetos, y los objetos devueltos por una solicitud de recuperación se almacenan en una matriz.
Si preservar el orden de los objetos es importante, deberá incluir un atributo en su entidad que pueda usarse para ordenar los objetos cuando los recupere.
La respuesta de Philip es correcta. No almacena arrays en Core Data. Es totalmente contrario a lo que Core Data está hecho. La mayoría de las veces, no necesita la información de la matriz, sino una y la puede cargar dinámicamente Core Data. En el caso de las colecciones, no hay diferencia si itera a través de una matriz de sus propiedades o de una matriz de resultados obtenidos en un NSSet
(que básicamente es solo una matriz).
Aquí está la explicación de lo que dijo Felipe. No puede almacenar una matriz directamente, pero puede crear una lista de propiedades a partir de ella. Hay un método en todos los Arraytypes NS que le da una cadena agradable y limpia y cadenas de amor de datos centrales. Lo bueno de las listas de propiedades almacenadas como cadenas es que pueden convertirse en lo que eran. Hay un método para eso en NSString
. Tataaa ...
Hay un precio por supuesto. Las matrices como listas de propiedades pueden volverse gigantescas y eso no funciona bien con los dispositivos iOS donde la RAM es limitada. Intentar guardar una matriz en los datos centrales indica un diseño deficiente de la entidad, especialmente para datos de gran tamaño. Una pequeña matriz está bien por razones de velocidad.
Otra manera, que consume menos espacio, es usar listas de propiedades binarias. Aquellos que se acercan a los tamaños zip cuando se almacenan en Core Data o directamente en el sistema de archivos. Lo malo es que no puedes simplemente abrirlos y leerlos como un archivo XML o JSON. Para el desarrollo, prefiero algo legible por humanos y para lanzar la versión binaria. Una constante vinculada al valor de DEBUG
en el preprocesador se encarga de eso, así que no tengo que cambiar mi código.
Los atributos transformables son la forma correcta de conservar valores de objetos que, de lo contrario, no serían compatibles en Core Data (como NSArray
). De la Guía de programación de datos básicos: Atributos persistentes no estándar :
La idea detrás de los atributos transformables es que accede a un atributo como un tipo no estándar, pero detrás de escena Core Data usa una instancia de NSValueTransformer para convertir el atributo a una instancia de NSData. Core Data luego almacena la instancia de datos en la tienda persistente.
Un atributo transformable utiliza un NSValueTransformer para almacenar un objeto que de otro modo no sería compatible en el almacén persistente. Esto permite que Core Data almacene casi cualquier cosa que pueda representarse como NSData, lo que puede ser muy útil. Lamentablemente, los atributos transformables no pueden coincidir en un predicado ni usarse en los resultados de clasificación con NSSQLiteStoreType. Esto significa que los atributos transformables son útiles solo para el almacenamiento, no para el descubrimiento de objetos.
El transformador predeterminado permite almacenar cualquier objeto que admita NSCoding
(o NSSecureCoding
) como un atributo transformable. Esto incluye NSArray
, UIColor
, UIImage
, NSURL
, CLLocation
y muchos otros. No se recomienda utilizar esto para datos que pueden ser arbitrariamente grandes, ya que pueden tener un impacto significativo en el rendimiento al consultar la tienda. Las imágenes, por ejemplo, no se ajustan a los atributos transformables: son grandes bolsas de bytes que fragmentan la tienda. En ese caso, es mejor utilizar las capacidades de almacenamiento de registros externos de Core Data, o almacenar los datos por separado como un archivo, y almacenar la URL en el archivo en Core Data. Si debe almacenar un UIImage
en Core Data, asegúrese de conocer las compensaciones involucradas.
Crear un atributo transformable es fácil:
• En Xcode Core Data Model Editor, seleccione el atributo de modelo que desea modificar. En el inspector del lado derecho, configure el tipo de atributo como "Transformable". Puede dejar el campo "Nombre" en blanco para usar el transformador predeterminado. Si estuviera usando un transformador personalizado, ingrese el nombre de la clase aquí y registre la clase usando +[NSValueTransformer setValueTransformer:forName:]
en algún lugar de su código.
• En su NSManagedObject
subclase NSManagedObject
declare la propiedad que describe el atributo transformable con el tipo correcto. En este caso, estamos usando NSArray
:
@property (nonatomic, retain) NSArray *transformedArray;
• En el archivo de implementación de la subclase NSManagedObject
la propiedad debe ser dinámica:
@dynamic transformedArray;
Y has terminado. Cuando se pasa un objeto de valor NSArray
a setTransformedArray:
el objeto conserva esa matriz. Cuando se guarda el contexto, Core Data transformará NSArray
en NSData
utilizando NSValueTransformer
descrito en el modelo. Los bytes NSData
se guardarán en la tienda persistente.
No almacena un NSArray
forma nativa en Core Data. Debe transformar los valores almacenados dentro de la matriz en algo que Core Data pueda usar, y luego guardar los datos en la tienda para que pueda empujar y tirar a su NSArray
según sea necesario.
Si realmente necesita hacerlo, codifique como datos. Simplemente creé un nuevo archivo llamado llamado receive
como NSData (datos binarios).
Luego, en la implementación de NSManagedObject:
-(void)setReceiveList:(NSArray*)list{
self.receive = [NSKeyedArchiver archivedDataWithRootObject:list];
}
-(NSArray*)getReceiveList{
return [NSKeyedUnarchiver unarchiveObjectWithData:self.receive];
}