ver tengo puedo otros nada memoria lleno limpiar gestionar espacio dónde documentos datos cómo como borrar apartado almacenamiento iphone objective-c core-data ios

puedo - iphone almacenamiento lleno y no tengo nada



¿Cómo debo almacenar UIImages dentro de mi base de datos Core Data? (3)

Estoy desarrollando una aplicación que demanda alrededor de 100 imágenes o tal vez más para que se inserten previamente en la base de datos Core Data junto con otra información relacionada.

Ahora puedo agregar fácilmente otros datos simplemente escribiendo algunas líneas de código, pero para UIImages no estoy seguro de cómo hacerlo sin escribir mucho código. Me preguntaba: ¿hay alguna forma de hacerlo fácilmente o si no existe cuál es la mejor manera de lograrlo con la menor cantidad de esfuerzo posible?

Además, ¿está bien almacenar imágenes en una base de datos Core Data o solo deberíamos guardar las direcciones de las imágenes en el sistema de archivos local?


Almacenar imágenes dentro de una base de datos Core Data es bastante fácil de hacer. Solo necesita marcar su atributo de imagen como uno transformable y crear una subclase de NSValueTransformer. Dentro de esa subclase, agregue código como el siguiente:

+ (Class)transformedValueClass { return [NSData class]; } + (BOOL)allowsReverseTransformation { return YES; } - (id)transformedValue:(id)value { if (value == nil) return nil; // I pass in raw data when generating the image, save that directly to the database if ([value isKindOfClass:[NSData class]]) return value; return UIImagePNGRepresentation((UIImage *)value); } - (id)reverseTransformedValue:(id)value { return [UIImage imageWithData:(NSData *)value]; }

Para su atributo transformable, especifique el nombre de esta subclase como el Nombre del transformador de valor.

A continuación, puede crear una subclase NSManagedObject para la entidad que aloja este atributo de imagen y declarar una propiedad para este atributo de imagen:

@property(nonatomic, retain) UIImage *thumbnailImage;

Puede leer UIImages desde y escribir UIImages en esta propiedad y se cambiarán de forma transparente a NSData y se guardarán en la base de datos.

Si o no hacer esto depende de su caso particular. Las imágenes más grandes probablemente no deberían almacenarse de esta manera, o al menos deberían estar en su propia entidad para que no sean recuperadas en la memoria hasta que se siga una relación con ellas. Las pequeñas imágenes en miniatura probablemente estén bien para poner en su base de datos de esta manera.


Apple proporciona algunos consejos sobre BLOB: objetos de datos grandes (BLOB)

Si su aplicación utiliza BLOB grandes ("Binary Large OBjects", como imágenes y datos de sonido), debe tener cuidado para minimizar los gastos generales. La definición exacta de "pequeño", "modesto" y "grande" es fluido y depende del uso de una aplicación. Una regla general suelta es que los objetos del orden de kilobytes de tamaño son de un tamaño "modesto" y aquellos del orden de megabytes de tamaño son de tamaño "grande". Algunos desarrolladores han logrado un buen rendimiento con 10MB BLOB en una base de datos. Por otro lado, si una aplicación tiene millones de filas en una tabla, incluso 128 bytes podrían ser un CLOB de tamaño "modesto" (OBject Large Object) que debe normalizarse en una tabla separada.

En general, si necesita almacenar BLOB en una tienda persistente, debe usar una tienda SQLite. Las tiendas binarias y XML requieren que todo el gráfico de objetos resida en la memoria, y las escrituras de la tienda sean atómicas (consulte "Características de la tienda persistente"), lo que significa que no manejan de manera eficiente objetos de datos de gran tamaño. SQLite puede escalar para manejar bases de datos extremadamente grandes. Si se usa correctamente, SQLite proporciona un buen rendimiento para bases de datos de hasta 100 GB, y una sola fila puede contener hasta 1GB (aunque, por supuesto, leer 1GB de datos en la memoria es una operación costosa sin importar cuán eficiente sea el repositorio).

Un BLOB a menudo representa un atributo de una entidad; por ejemplo, una fotografía puede ser un atributo de una entidad Empleado. Para BLOB (y CLOB) de tamaño pequeño a modesto, debe crear una entidad separada para los datos y crear una relación uno a uno en lugar del atributo. Por ejemplo, puede crear entidades de Empleado y Fotografía con una relación uno a uno entre ellas, donde la relación de Empleado a Fotografía reemplaza el atributo de fotografía del Empleado. Este patrón maximiza los beneficios de la falla de objetos (ver "Faulting and Uniquing"). Cualquier fotografía dada solo se recupera si realmente es necesaria (si la relación se cruza).

Sin embargo, es mejor si puede almacenar BLOB como recursos en el sistema de archivos y mantener enlaces (como URL o rutas) a esos recursos. Luego puede cargar un BLOB cuando sea necesario.


Un buen ejemplo del transformador de imagen descrito anteriormente está en la aplicación de demostración iPhoneCoreDataRecipes.