在房间数据库中保存图像

时间:2020-10-07 14:01:38

标签: database android-studio kotlin android-room

我想在房间数据库中保存小图像,但有两个问题:

  1. 如何将图像保存到数据库中?
  2. 如何在数据库中保存多个图像?

我尝试以开发者页面(https://developer.android.com/training/data-storage/room/defining-data)推荐的方式保存位图

@Parcelize
@Entity(tableName = "image_table")
data class ImgMod(

    @PrimaryKey(autoGenerate = true)
    var invoiceId: Long = 0L,

    @ColumnInfo(name = "image")
    var single_img: Bitmap?
): Parcelable

但是,我收到以下错误:

Cannot figure out how to save this field into database. You can consider adding a type converter for it.

第二,我想将多个图像保存在一个数据库条目中。但是,以下代码段却收到相同的错误:

    @ColumnInfo(name = "imageList")
    var img_list: ArrayList<BitMap>

或解码后的位图作为字符串

    @ColumnInfo(name = "imageList")
    var decoded_img_list: ArrayList<String>

很抱歉,如果这是一个非常基本的问题。但是,我该如何配置数据库/将数据处理到图像列表中?

先谢谢您, rot8

1 个答案:

答案 0 :(得分:0)

一种非常简单的将图像导入数据库的方法(尽管我个人不建议这样做)是将位图以base-64编码为String并将其放入数据库的一行中。

考虑到位图占用大量内存;和base64编码会增加一些东西的大小,因此在加载一堆图像时要小心……我也确实认为Room和SQLite支持二进制数据作为blob,因此您可以将列声明为ByteArray,它应该工作吧。

我在项目中一直在做的事情是将它们写入应用程序的内部或外部存储中,然后将引用Uri作为String存储,以便以后能够检索图像从磁盘。

令我沮丧的是每行填充一个以上的值;在SQL语句中包含一系列内容绝对不是您应该遵循的模式。创建“联接”表应该足够简单,或者可以用来对它们进行分组的额外的列应该很容易,对吧?