web-dev-qa-db-ja.com

ルーム永続ライブラリに画像を挿入する方法は?

私はAndroidアプリケーションにルーム永続化ライブラリを使用しています。今度はデータベースに画像を挿入する必要があります。プリミティブデータ型の@Entityを正常に定義します。オブジェクト、日付、時刻、今は画像を保存する必要がありますが、列情報とエンティティを定義する方法と、そのデータを挿入する方法と、テーブルからデータを読み取る方法を理解できません。

単一行に挿入されるデータの最大サイズは? Android SQLiteの1つのフィールドのデータの最大サイズと最小サイズは何ですか?

15
Prince Kumar

通常、画像データをデータベースに保存することは推奨されません。ただし、プロジェクトに必要な場合は実行できます。

通常、画像データはBLOBデータ型を使用してdbに保存されます。RoomはBLOBデータ型もサポートします Documentation

画像データを保存するために、以下で説明するようにエンティティクラスを宣言できます。

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

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

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

Pinakinが述べたように、画像をデータベースに保存することは推奨されず、ファイルパスの方が優れていますが、画像を保存する必要がある場合は、画像を2 MB未満に圧縮することをお勧めします( 例はこちら )アプリの破損を避けるため。部屋は画像のBLOBをサポートしています。 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
   }

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 
     }

間違っている場合は修正してください。これが誰かを助けることを願っています

7
adithya reddy