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.