私はAndroidアプリケーションにルーム永続化ライブラリを使用しています。今度はデータベースに画像を挿入する必要があります。プリミティブデータ型の@Entityを正常に定義します。オブジェクト、日付、時刻、今は画像を保存する必要がありますが、列情報とエンティティを定義する方法と、そのデータを挿入する方法と、テーブルからデータを読み取る方法を理解できません。
単一行に挿入されるデータの最大サイズは? Android SQLiteの1つのフィールドのデータの最大サイズと最小サイズは何ですか?
通常、画像データをデータベースに保存することは推奨されません。ただし、プロジェクトに必要な場合は実行できます。
通常、画像データは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;
}
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 }
間違っている場合は修正してください。これが誰かを助けることを願っています