Как вставить изображение в библиотеку сохранения пространства?

Я использую библиотеку сохранения пространства для моего приложения для Android. Теперь мне нужно вставить изображение в свой db. Я успешно определяю @Entity для примитивного типа данных. а также через класс преобразователя, я сохранил весь объект, дату, время. Теперь я должен хранить изображение. Я не могу понять, как мы определяем информацию и сущность столбца и как мы вставляем эти данные, а также читаем данные из таблицы.

Каков максимальный размер данных, вставленных в одну строку? Каков максимальный и минимальный размер данных в одном поле в Android SQLite?

Ответ 1

Обычно не рекомендуется хранить данные изображения в базе данных. Но если это требуется для вашего проекта, вы можете сделать это.

Данные изображения обычно хранятся в db с использованием типа данных BLOB. Room также обеспечивает поддержку типа данных BLOB Документация

Вы можете объявить свой класс сущности, как указано ниже, для хранения данных изображения.

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

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

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

Ответ 2

Как упоминал Пинакин, не рекомендуется хранить изображение в базе данных, и путь к файлу будет лучше, но если требуется сохранить изображение, я бы предложил сжать изображение ниже 2 МБ (вот пример), чтобы избежать взлома приложения. Комната поддерживает BLOB для изображения. Класс сущности в котлине:

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
   }

В DatabaseHelper что-то вроде

  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 
     }

Исправьте меня, если я ошибаюсь. Надеюсь, это поможет кому-то там.