How insert image in room persistence library?

后端 未结 3 2075
轮回少年
轮回少年 2020-12-13 09:23

I am using room persistence library for my android application, Now I have to insert image in my db. I successfully define @Entity for the primitive data type. and also thro

3条回答
  •  别那么骄傲
    2020-12-13 10:12

    As Pinakin mentioned, it is not recommended to store an image into database and file path would be better but if it is required to store image I would suggest compress the image to below 2 MB (here is an example) to avoid breaking app. Room supports BLOB for image. Entity class in 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
       }
        
    

    In DatabaseHelper something like

      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 
         }
    

    Correct me if I am wrong. Hope this helps someone out there

提交回复
热议问题