我有一个项目要求,如想在房间数据库中存储多个图像。从服务器端,我获取图像URL当我下载图像时,我只需要将图像存储在房间数据库中,我总共有25张图像。在保存图像到db后,在其他片段中想要显示这些所有图像的向左或向右滑动功能。
对于这25张图像,我有一个唯一的id,每个图像有不同的名称。
我第一次整合房间数据库,所以我怎么才能实现它?我已经看了很多答案,但没有得到正确的想法。
请引导我。如有任何帮助,不胜感激。
如果您不想处理权限,则可以使用此方法,因为如果用户拒绝权限,则无法将图像保存到文件夹。
你不能直接保存图像位图在房间数据库中,但你可以通过转换位图到ByteArray来存储它,你可以使用房间数据库提供的类型转换注释,你可以用你想要的格式传递对象,但房间数据库将以它接受的类型存储它。要创建Type Converter,必须创建一个新类,如下所示
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)
}
}
然后在房间数据库类的顶部添加@TypeConverters注释,
@Database(entities = [Entity::class],version = 1 , exportSchema = false)
@TypeConverters(Converters::class)
abstract class Database : RoomDatabase() {
abstract fun getDao(): Dao
}
和实体类类似,
@Entity(tableName = "running_table")
data class Entity(
var img: Bitmap? = null
)
现在你将把Bitmap传递给Entity,然后Room Database将把它转换为ByteArray并存储它,当你想检索数据库时,你将获得Bitmap。
不建议在SQLite中存储文件。如你所知,房间是基于SQLite的。在你的情况下,我认为是保存图像在内部存储(最好保存在文件夹,因为缓存文件夹将格式当设备存储满),然后保存文件的名称或地址在数据库列,每次你需要的图像,你可以从数据库读取地址,然后你想要什么。
我已经尝试将图像存储在房间数据库中,如Vaibhav所说。但你肯定会得到一个房间光标错误像这样迟早
Couldn't read row 0, col 1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
在android中必须将图像存储在scoped storage中,因此不需要获得任何权限并将该图像的路径保存在Room数据库中。滑翔会让你的工作更轻松。