Cómo almacenar una imagen en datos básicos

Soy nuevo en iOS. He intentado crear una aplicación que almacene una imagen capturada desde la cámara en CoreData . Ahora sé cómo almacenar datos como NSString s, NSDate y otros tipos, pero NSDate problemas para almacenar una imagen. He leído tantos artículos que dice que debe escribirlo en el disco y escribir en un archivo, pero parece que no puedo entenderlo.

El siguiente código es el que utilicé para almacenar otros datos en los datos centrales.

 - (IBAction)submitReportButton:(id)sender { UrbanRangerAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; managedObjectContext = [appDelegate managedObjectContext]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"PotholesDB" inManagedObjectContext:appDelegate.managedObjectContext]; NSManagedObject *newPothole = [[NSManagedObject alloc]initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext]; [newPothole setValue:self.relevantBody.text forKey:@"relevantBody"]; [newPothole setValue:self.subjectReport.text forKey:@"subjectReport"]; [newPothole setValue:self.detailReport.text forKey:@"detailReport"]; // [newPothole setValue:self.imageView forKey:@"photo"]; NSDate *now = [NSDate date]; //NSLog(@"now : %@", now); NSString *strDate = [[NSString alloc] initWithFormat:@"%@", now]; NSArray *arr = [strDate componentsSeparatedByString:@" "]; NSString *str; str = [arr objectAtIndex:0]; NSLog(@"now : %@", str); [newPothole setValue:now forKey:@"photoDate"]; [newPothole setValue:self.latitudeLabel.text forKey:@"latitude"]; [newPothole setValue:self.longitudeLabel.text forKey:@"longitude"]; [newPothole setValue:self.addressLabel.text forKey:@"streetName"]; [newPothole setValue:streeNameLocation forKey:@"location"]; NSError *error; [managedObjectContext save:&error]; UIAlertView *ll = [[UIAlertView alloc] initWithTitle:@"Saving" message:@"Saved data" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [ll show]; } 

Puede almacenar imágenes en Core Data utilizando el tipo de atributo Datos binarios. Sin embargo, debes tener en cuenta algunas cosas:

  • Siempre convierta su UIImage a un formato de datos portátil como png o jpg Por ejemplo:

    NSData *imageData = UIImagePNGRepresentation(image);

  • Habilita “Permitir almacenamiento externo” en este atributo descripción Core Data moverá los datos a un archivo externo si alcanza un cierto umbral. Este archivo también está completamente administrado por Core Data, por lo que no tiene que preocuparse por ello.

  • Si se encuentra con problemas de rendimiento, intente mover el atributo Datos Binarios a una entidad separada.

  • Debe abstraer la conversión a NSData detrás de la interfaz de su subclase NSManagedObject, para que no tenga que preocuparse por las conversiones de UIImage a NSData o viceversa.

  • Si sus imágenes no están estrechamente relacionadas con las entidades de su modelo, le sugiero que las guarde fuera de Core Data.

En la subclase xcdatamodelId, declarar entidad de imagen como NSData … no puede usar el formato UIImage porque los datos de imagen están en formato binario.

 @property (nonatomic, retain) NSData *imag; 

En el archivo de Implementación … convertir UIImage a NSData

 UIImage *sampleimage = [UIImage imageNamed:@"sampleImage.jpg"]; NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 0.0); 

Entonces finalmente guárdalo

 [obj setValue:dataImage forKey:@"imageEntity"]; // obj refers to NSManagedObject 
 - (void)imageChanged:(UIImage*)image{ if (self.detailItem) { [self.detailItem setValue:UIImagePNGRepresentation(image) forKey:kSignatureImage]; } } 

En este un breve ejemplo. self es un controlador de vista que utiliza datos centrales y self.detailItem es el NSManagedObject habitual. En ese proyecto, no creé clases modelo para las entidades, sino que uso estrictamente el patrón KVC para acceder a los atributos. Como se puede adivinar, el atributo se llama "signatureImage" que yo había definido en una constante #define kSignatureImage .

Aquí es donde se restaura la imagen a partir de los datos centrales:

 self.signatureCanvas.image = [UIImage imageWithData:[self.detailItem valueForKey:kSignatureImage]]; 

De nuevo, self es un controlador de vista, signatureCanvas es una subclase .image e .image es su propiedad de image regular heredada de UIImageView . detailItem , nuevamente, es el NSManagedObject habitual.

El ejemplo está tomado de un proyecto en el que estoy trabajando actualmente.

Existen ventajas y desventajas para almacenar objetos de datos de gran tamaño, como imágenes en datos básicos, o separarlos en archivos. Almacenarlos en archivos significa que usted es responsable de eliminarlos cuando se eliminan los objetos de datos relacionados. Eso proporciona una sobrecarga de encoding y puede ser volátil para errores de progtwigción. Por otro lado, puede ralentizar la base de datos subyacente. Todavía no tengo suficiente experiencia con este enfoque que pueda compartir con respecto al rendimiento. Al final, el espacio ocupado en el disco ocupa aproximadamente el mismo tamaño en total.

Pocos enlaces que puedan ayudarlo a superar este problema

https://stackoverflow.com/a/3909082/558000

Guarde y recupere un UIImage en CoreData

http://ootips.org/yonat/uiimage-in-coredata/

No sé por qué quiere almacenar imágenes en los datos centrales, mientras que hay otro almacenamiento persistente disponible en iOS. Si solo desea almacenar imágenes para fines de caché, puede almacenarlas en el directorio de documentos o en el directorio de caché. Feliz encoding …

Consulte a continuación la URL, Cómo almacenar y recuperar imágenes en el directorio de documentos.

http://www.wmdeveloper.com/2010/09/save-and-load-uiimage-in-documents.html

Guardar imagen en el directorio de Documentos y recuperar datos adjuntos de correo electrónico

¿Cómo creo un archivo temporal con Cocoa?