Saltar al contenido

¿Cómo insertar una imagen en la biblioteca de persistencia de la habitación?

Verificamos exhaustivamente cada artículo de nuestro espacio con la meta de enseñarte siempre información certera y actual.

Solución:

Por lo general, no se recomienda almacenar datos de imágenes en la base de datos. Sin embargo, si es necesario para su proyecto, puede hacerlo.

Los datos de imagen generalmente se almacenan en db usando el tipo de datos BLOB, Room también brinda soporte para la documentación del tipo de datos BLOB

Puede declarar su clase de entidad como se menciona a continuación para almacenar datos de imagen.

@Entity(tableName = "test")
public class Test

@PrimaryKey
@ColumnInfo(name = "_id")
private int id;

@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
private byte[] image;

Como mencionó Pinakin, no se recomienda almacenar una imagen en la base de datos y la ruta del archivo sería mejor, pero si es necesario almacenar la imagen, sugeriría comprimir la imagen por debajo de 2 MB (aquí hay un ejemplo) para evitar romper la aplicación. Room admite BLOB para la imagen. Clase de entidad en kotlin:

ImageTest.kt

 @Entity    
 class ImageTest 

        @PrimaryKey(autoGenerate = true)

        var id: Int = 1

        @ColumnInfo(typeAffinity = ColumnInfo.BLOB)
        var data: ByteArray? = null
      

ImageDao.kt

 @Dao
 interface ImageTestDao 

       @Insert(onConflict = OnConflictStrategy.REPLACE)
       fun upsertByReplacement(image: List)

       @Query("SELECT * FROM image")
       fun getAll(): List

       @Query("SELECT * FROM image WHERE id IN (:arg0)")
       fun findByIds(imageTestIds: List): List

       @Delete
       fun delete(imageTest: ImageTest)
   

Databse.kt

 import android.arch.persistence.room.Database
 import android.arch.persistence.room.RoomDatabase
 import android.arch.persistence.room.TypeConverters

   @Database(entities = arrayOf(ImageTest::class), version = 1)
   @TypeConverters(DataConverters::class)
   abstract class Database : RoomDatabase() 
    abstract fun getImageTestDao(): ImageTestDao
   
    

En DatabaseHelper algo como

  class DatabaseHelper(context: Context) {

   init 
        DatabaseHelper.context = WeakReference(context)
        

   companion object {
    
   private var context: WeakReference? = null
   private const val DATABASE_NAME: String = "image_test_db"
   private var singleton: Database? = null

   private fun createDatabase(): Database 
       return Room.databaseBuilder(context?.get() ?:
               throw IllegalStateException("initialize by calling  
               constructor before calling DatabaseHelper.instance"),
               Database::class.java,
               DATABASE_NAME)
               .build()
   


   val instance: Database
       @Synchronized get() 
           if (null == singleton)
               singleton = createDatabase()

           return singleton as Database
       

     fun setImage(img: Bitmap){
     val dao = DatabaseHelper.instance.getImageTestDao() 
     val imageTest = ImageTest()
     imageTest.data = getBytesFromImageMethod(image)//TODO
     dao.updsertByReplacement(imageTest)

     fun getImage():Bitmap?
     val dao = DatabaseHelper.instance.getImageTestDao() 
     val imageByteArray = dao.getAll()
     return loadImageFromBytes(imageByteArray[0].data)
     //change accordingly 
     

Corrígeme si estoy equivocado. Espero que esto ayude a alguien

Guarde la imagen como un archivo y guarde la ruta del archivo Uri en Room

Como se vio en CameraX‘s captura de imagen caso de uso, cuando se toma una foto con éxito, la ruta de archivo de referencia Uri, savedUri, se puede recuperar de forma segura.

Entonces, el Uri se puede convertir en un string con savedUri.toString()y guardado en Room.

  • Es importante asegurarse de que la referencia del archivo de Room también se actualice si el archivo se mueve o se elimina.
  • Es posible que la cadena de imágenes guardada en Room deba convertirse nuevamente en un Uri para que se muestre con una biblioteca de imágenes como Glide with Uri.parse(someString).

En la muestra de CameraX, la Uri de una ruta de imagen se puede obtener de forma segura en onImageSaved.

  • Luego se guardaría en Room fuera del hilo principal usando Kotlin Coroutines o RxJava, preferiblemente en un ViewModel o en algún lugar que maneje la lógica de negocios separada de la lógica de la vista.

Introducción a CameraX> 5. Implementar el caso de uso de ImageCapture

private fun takePhoto() 
   // Get a stable reference of the modifiable image capture use case
   val imageCapture = imageCapture ?: return

   // Create time-stamped output file to hold the image
   val photoFile = File(
       outputDirectory,
       SimpleDateFormat(FILENAME_FORMAT, Locale.US
       ).format(System.currentTimeMillis()) + ".jpg")

   // Create output options object which contains file + metadata
   val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()

   // Set up image capture listener, which is triggered after photo has
   // been taken
   imageCapture.takePicture(
       outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback 
           override fun onError(exc: ImageCaptureException) 
               Log.e(TAG, "Photo capture failed: $exc.message", exc)
           

           override fun onImageSaved(output: ImageCapture.OutputFileResults) 
               val savedUri = Uri.fromFile(photoFile)
               val msg = "Photo capture succeeded: $savedUri"
               Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
               Log.d(TAG, msg)
           
       )

Esta estrategia se describe en Guardar imagen en la base de datos de la habitación en Reddit.

Almacenamiento en la nube

Crear un archivo para la imagen y guardar la ruta del archivo en Room cubre el almacenamiento local. Con el fin de garantizar que las imágenes se guarden en varios dispositivos o cuando se borran los datos y la caché de datos, una forma de Almacenamiento en la nube es necesario para cargar los archivos y descargarlos y sincronizarlos con el almacenamiento local.

valoraciones y comentarios

Si haces scroll puedes encontrar las explicaciones de otros programadores, tú además eres capaz insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *