web-dev-qa-db-fra.com

Comment insérer une image dans la bibliothèque de persistance de pièce?

J'utilise la bibliothèque de persistance de salle pour mon Android, maintenant je dois insérer une image dans ma base de données. J'ai réussi à définir @Entity pour le type de données primitif. objet, date, heure. Maintenant, je dois stocker l'image. Je ne peux pas comprendre comment nous définissons les informations de colonne et l'entité et comment nous insérons ces données ainsi que lire les données de la table.

Quelle est la taille maximale des données insérées dans la ligne unique? Quelle est la taille maximale et minimale des données dans un champ dans Android SQLite?

15
Prince Kumar

Il n'est généralement pas recommandé de stocker les données d'image dans la base de données. Mais si cela est nécessaire pour votre projet, vous pouvez le faire.

Les données d'image sont généralement stockées dans db en utilisant le type de données BLOB, Room fournit également la prise en charge du type de données BLOB Documentation

Vous pouvez déclarer votre classe d'entité comme mentionné ci-dessous pour stocker les données d'image.

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

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

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

Comme Pinakin l'a mentionné, il n'est pas recommandé de stocker une image dans la base de données et le chemin du fichier serait mieux, mais s'il est nécessaire de stocker l'image, je suggère de compresser l'image à moins de 2 Mo ( voici un exemple ) pour éviter de casser l'application. La salle prend en charge BLOB pour l'image. Classe d'entité 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<ImageTest>)

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

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

       @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
   }

Dans DatabaseHelper quelque chose comme

  class DatabaseHelper(context: Context) {

   init {
        DatabaseHelper.context = WeakReference(context)
        }

   companion object {

   private var context: WeakReference<Context>? = 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 
     }

Corrigez-moi si je me trompe. J'espère que cela aide quelqu'un là-bas

7
adithya reddy