我爲我的Android應用程序使用房間持久性庫,現在我必須在我的數據庫中插入圖像。我成功地爲原始數據類型定義了@Entity。也通過轉換器類,我存儲了所有的對象,日期,時間。現在我必須存儲圖像。我無法理解我們如何定義列信息和實體,以及如何插入數據以及如何從表中讀取數據。如何在房間持久性庫中插入圖像?
插入單行的數據的最大大小是多少? Android SQLite的一個字段中數據的最大和最小大小是多少?
我爲我的Android應用程序使用房間持久性庫,現在我必須在我的數據庫中插入圖像。我成功地爲原始數據類型定義了@Entity。也通過轉換器類,我存儲了所有的對象,日期,時間。現在我必須存儲圖像。我無法理解我們如何定義列信息和實體,以及如何插入數據以及如何從表中讀取數據。如何在房間持久性庫中插入圖像?
插入單行的數據的最大大小是多少? Android SQLite的一個字段中數據的最大和最小大小是多少?
通常不建議將圖像數據存儲到數據庫中。 但是,如果它是您的項目需要,那麼你可以這樣做。
的圖像數據通常被存儲到使用BLOB數據類型分貝,客房還提供支持BLOB數據類型Documentation
提到以下存儲圖像數據可以聲明實體類。
@Entity(tableName = "test")
public class Test{
@PrimaryKey
@ColumnInfo(name = "_id")
private int id;
@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
private byte[] image;
}
感謝它的工作。我需要添加編碼器和解碼器,將原始圖像轉換爲字節[]和字節[]到原始圖像 –
@PrinceKumar True,需要將位圖的編碼器和解碼器轉換爲字節[],反之亦然。 – Pinakin
我不能使用Blob類型? –
正如Pinakin提到的,不建議將圖像存儲到數據庫和文件路徑會更好,但如果需要存儲圖像,我建議將圖像壓縮到低於2 MB(here is an example),以避免打破應用。房間支持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 }
糾正我,如果我錯了。希望這可以幫助那裏的人
感謝每一行的解釋和易於理解的解決方案我在java中的整個項目。 –
您可以使用blob在房間中存儲圖像。 – Reena
按照此https://developer.android.com/topic/libraries/architecture/room.html – Ankita
@Ankita室內持久性,我們他們忽略的BitMap –