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?
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;
}
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