Soy nuevo en iOS. He estado tratando de hacer una aplicación que se va a almacenar una imagen capturada por la cámara en CoreData. Ahora sé cómo almacenar datos como NSStrings, NSDate y de otro tipo, pero luchando para almacenar una imagen. He leído muchos artículos diciendo que usted debe escribir en el disco y escribir en un archivo, pero me parece que no puede entender.

El siguiente código es el que se utiliza para almacenar otro tipo de datos a los datos de los núcleos.

  • Su imagen es, probablemente, almacenados en un UIImage objeto. Si es así, usted puede convertir a un NSData objeto con esto : NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(myUIImage)]; creo almacenar NSData objetos en CoreData no es realmente difícil.
  • De la OMI, el almacenamiento de datos binarios en una base de datos es generalmente aconsejable. Será más lento para recuperar que la lectura del disco y desde Datos Básicos que probablemente será el uso de SQLite internamente, que efectivamente va a ser el almacenamiento de archivos dentro de un archivo (el SQLite DB), haciendo que se expanda en tamaño muy rápidamente y la ralentización de la DB operaciones considerablemente. Acabo de almacenar la ruta de acceso en la base de datos y, a continuación, guarde las imágenes en el disco.
  • Estoy de acuerdo con dandan78. Es aconsejable guardar las imágenes a la tienda. Definitivamente, usted debe guardar la ruta de la imagen en su lugar.
  • Usted puede obtener los datos de la imagen desde UIImagePNGRepresentaion o UIImageJPEGrepresentation y guardar los datos. Al obtener los datos que crear la imagen con +imageWithData: . Por supuesto, usted puede guardar en archivos y solo guardar el nombre del archivo. Hice ambas cosas. Dame un minuto y te voy a buscar algún código sniplets.
  • Si decide guardar sus imágenes en el Núcleo de la base de Datos, puede elegir la opción «Almacenar en el Registro Externo de Archivos» opción en el editor del modelo, de modo que los Datos de los núcleos puede decidir almacenar grandes datos binarios en un almacenamiento separado por razones de rendimiento.
  • rápida aplicación
  • Obtener más de él. Usted puede almacenar imágenes en Datos Básicos, dependiendo del tamaño. Si son menos de 100k comprimido que incluso no tiene que ser en un archivo externo. Nos encontramos con el rendimiento está bien.

InformationsquelleAutor Sipho Koza | 2013-05-22

7 Comentarios

  1. 166

    Puede almacenar las imágenes en el Núcleo central de Datos, usando los Datos Binarios del tipo de atributo.
    Sin embargo, usted debe ser consciente de algunas cosas:

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

      NSData *imageData = UIImagePNGRepresentation(image);

    • Permitir «que Permite el almacenamiento externo» en este atributo
      Cómo guardar una imagen en datos básicos
      Los Datos de los núcleos se mueven los datos a un archivo externo si se golpea con un cierto umbral. Este archivo también es completamente administrado por los Datos de los núcleos, así que usted no tiene que preocuparse acerca de esto.

    • Si llegas a tener problemas de rendimiento, trate de mover los Datos Binarios atributo a una entidad separada.

    • Debe resumen de la conversión a NSData detrás de la interfaz de su NSManagedObject subclase, así que usted no tiene que preocuparse acerca de las conversiones de UIImage a NSData o viceversa.

    • Si las imágenes no están fuertemente relacionadas con las entidades en el modelo, sugiero que se almacena fuera de los Datos Básicos.

    • Para «Usted debe resumen de la conversión a NSData detrás de la interfaz de su NSManagedObject subclase, así que usted no tiene que preocuparse acerca de las conversiones de UIImage a NSData o viceversa.» podrías explicar como hacerlo?
    • Crear un método para establecer la imagen – (void)setImage:(UIImage *)imagen; Probablemente en una Categoría. En ese método, el uso de UIImagePNGRepresentaion o UIImageJPEGrepresentation de modo que usted sólo tiene que hacerlo una vez (usted no desea guardar como PNG y tratar de convertir a JPEG).
  2. 12

    En xcdatamodelId subclase declarar la imagen de la entidad como NSData… no se puede usar UIImage formato debido a que los datos de imagen en formato binario.

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

    Finalmente guardarlo

  3. 4

    En este un ejemplo muy breve. self es un controlador de vista de uso de los datos básicos y de auto.detailItem es la habitual de NSManagedObject. En ese proyecto yo no crear clases de modelo para las entidades, pero estrictamente el uso de la KVC patrón para tener acceso a los atributos. Como se puede adivinar, el atributo se denomina "signatureImage" que yo había definido en un #define constante kSignatureImage.

    Aquí es donde se restaura la imagen de los datos de núcleos:

    De nuevo, self es un controlador de vista, signatureCanvas es un UIImageView subclase y .image es su regular image propiedad heredada de UIImageView. detailItem, de nuevo, es la costumbre NSManagedObject.

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

    Hay pros y contras para almacenar datos de gran tamaño de los objetos como imágenes en los datos de los núcleos, o tenerlos separados en archivos. Almacenar en ficheros significa que usted es responsable de la eliminación de ellos cuando los datos relacionados con los objetos son eliminados. Que proporciona la codificación de la sobrecarga y pueden ser volátiles por errores de programación.
    Por otro lado, es posible que se reduzca la base de datos subyacente. Aún no tengo la suficiente experiencia con este enfoque que podría compartir con respecto a la performance.
    En la final, el almacenamiento en disco ocupado es de aproximadamente el mismo tamaño en total.

  4. 1

    Es posible almacenar imágenes en Datos Básicos como UIImage. Aunque esto no se considera una buena práctica como Bases de datos no están destinados para el almacenamiento de archivos. No usamos el núcleo de datos para almacenar las imágenes directamente en su lugar usamos la ruta de acceso del archivo a donde los datos de la imagen se almacena en el teléfono.

    De todos modos, el mejor método que he encontrado durante el desarrollo del proyecto se muestra a continuación

    1. Establezca la entidad codeGen Manual/Ninguno

    2. Seleccione el atributo que desea ser del tipo de Imagen y elija transformables como es el tipo de

    3. Introduzca Personalizado identificador de clase como UIImage

    4. Ir a editor y seleccione Crear NSManagedObject Subclase

    5. El Proceso de crear 2 swift archivos dependiendo del número de entidades(yo sólo tenía 1 entidad). Ahora, seleccione la <EntityName> + CoreDataProperties.swift archivo y importación de UIKit

    Si, al hacer clic en Saltar a la Definición para el @NSManaged public var UIImage definition su trabajo está hecho.

    Realizar acciones en las entidades como usted y usted será capaz de recuperar, guardar, editar el atributo de imagen por abajo-casting <EntityName>?.value(forKey: "<attributeName>") as? UIImage.

    He tenido que utilizar a la entidad como NSManagedObject tipo y fue por alguna razón no puede acceder a la imagen directamente desde la creación de la subclase.

  5. 0

    No sé por qué desea almacenar la imagen en el núcleo central de los datos, mientras que hay otros persistente de almacenamiento disponible en iOS. Si usted sólo desea almacenar la imagen para la memoria caché propósito, se pueden almacenar en el directorio de documento o directorio de memoria caché. Feliz Codificación…

    Por favor consulte el siguiente 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 la imagen para directorio de Documentos y la recuperación de archivo adjunto de correo electrónico

    ¿Cómo puedo crear un archivo temporal con el Cacao?

    • Un montón de buenas razones. Puede que desee copiar la base de datos y enviarlo a un dispositivo diferente. Mucho más fácil si está sentado en una sqlite de la tienda. Y en general es más fácil de manejar sin un montón de mierda de código para mantener mantenido.

Dejar respuesta

Please enter your comment!
Please enter your name here