簡體   English   中英

在房間數據庫中存儲多個圖像

[英]Store multiple images in room database

我有一個項目要求,比如想在房間數據庫中存儲多個圖像。 所以從服務器端我得到圖像 URL 所以當我下載圖像時我只想將圖像存儲在房間數據庫中並且我總共有 25 張圖像。 將圖像保存到數據庫后,在其他片段中想要顯示這些所有圖像以用於向左或向右滑動功能。

對於這 25 張圖片,我有一個唯一的 ID,每張圖片都有不同的名稱。

我是第一次整合房間數據庫,我該如何實現呢? 我經歷了許多 SO 答案,但沒有得到正確的想法。

請指導我。 任何幫助表示贊賞。

不建議將文件存儲在 SQLite 中。正如您所知,房間基於 SQLite 工作。在您的情況下,我認為將圖像保存在內部存儲中(最好保存在文件夾中,因為緩存文件夾將在設備存儲時被格式化完整),然后將文件名或地址保存在數據庫列中,每次您需要圖像時,您都可以從數據庫中讀取地址,然后再讀取任何您想要的內容。

如果您不想處理權限,則可以使用此方法,因為如果用戶拒絕權限,則無法將圖像保存到文件夾中。

您不能直接將圖像 Bitmap 保存在房間數據庫中,但您可以通過將 Bitmap 轉換為 ByteArray 來存儲它,並且您可以使用房間數據庫提供的類型轉換注釋,您可以使用它以您想要的格式傳遞 Object,但房間數據庫將將其存儲在它接受的類型中。 要創建類型轉換器,您必須創建一個新的 Class 像這樣,

class Converters {

@TypeConverter
fun fromBitmap(bmp: Bitmap): ByteArray{

    val outputStream = ByteArrayOutputStream()
    bmp.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
    return outputStream.toByteArray()
}

@TypeConverter
fun toBitmap(bytes: ByteArray): Bitmap {
    return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
}
}

然后在房間數據庫Class的頂部添加@TypeConverters注解,

@Database(entities = [Entity::class],version = 1 , exportSchema = false)

@TypeConverters(Converters::class)
abstract class Database : RoomDatabase() {

abstract fun getDao(): Dao

}

而實體 class 就像,

@Entity(tableName = "running_table")
data class Entity(
var img: Bitmap? = null
)

現在您將 Bitmap 傳遞給 Entity,然后 Room Database 會將其轉換為 ByteArray 並存儲它,無論何時您想要檢索數據庫,您都會得到 Bitmap。

正如 Vaibhav 所說,我曾嘗試將圖像存儲在房間數據庫中。 但你肯定遲早會遇到這樣的 Room curser 錯誤

Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

在 android 中必須將圖像存儲在范圍存儲中,因此無需獲得任何許可並將該圖像的路徑保存在 Room 數據庫中。 glide 將使您的工作變得輕松。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM