如何将图片保存到Room持久性库

4
起初,我正在向卡视图中添加信息(字符串)和照片(从drawable中获取)。我已经从列表中将其工作并将其添加到使用适配器等在recycler view中的卡片中。现在,我正在尝试使用Room持久性库保存此信息,而不是在代码中添加虚拟信息,我将从用户输入中获取它。在我尝试实现此操作时,我发现将图像保存到Room DB并不太容易。现在字符串已经可以正常工作,但我需要一种方法来保存从相机中拍摄的图像。

我无法使用Image、Bitmap、URI、Drawable类型将图像存储在Room DB中。

@Entity(tableName = "machines_table")
public class Machines {


    @PrimaryKey(autoGenerate = true)
    private int id;
    private Drawable photoId;
    private String name;
    private String location;

    public Machines(String name, String location, Drawable photoId) {
        this.name = name;
        this.location = location;
        this.photoId = photoId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public String getLocation() {
        return location;
    }

    public Drawable getPhotoId() {
        return photoId;
    }

}

我本以为能够更轻松地保存图像,但是使用我上述列表中的任何一种类型时,都会遇到以下错误:

"错误:无法确定如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。"

3个回答

11

您可能会将它们保存为byte[],但通常认为将位图保存到数据库中是不明智的。将它们存储到文件系统中并将文件名(例如基于UUID的文件名)保存到数据库中。需要时再检索文件。

如果数据库存储图像本身,则会变得非常庞大和缓慢。


将它们保存到文件系统中,我是否能够最终实现账户登录,使图像和其他信息出现在其他设备上?这是否属于自动备份的范畴?还是只保存在设备上,没有在设备之间同步的选项? - Raymond Riter

3

无法直接存储图片,有多种存储方式:

  1. 将图片转换为base64编码并存储在数据库中
  2. 保存到本地存储并在数据库中存储Uri
  3. 从服务器获取图像URL并在数据库中存储URL

1
你认为以下哪个选项最适合我想要能够最终按帐户保存这些信息,我计划在某个时候实现这一点,以便我可以通过多个设备上的登录检索此信息。将它们保存在本地,Android 的自动备份是否会支持这一点?我对所有这些都非常陌生,在我的大学里他们只提供了一门移动开发课程,而我已经在我的最后一个学期中等待名单了。然而,即使是与已经修过这门课的朋友交谈,他们也不知道我在做什么。在继续研究的同时,我真的没有其他人可以问。 - Raymond Riter
1
如果从服务器拉取信息,我的建议是使用第三个选项,从服务器获取图像URL并将其存储在数据库中,然后使用Glide或Picasso等工具加载图像,并以每个帐户保存的URL为准。 - Alireza Tizfahm Fard
我已经研究了Picasso和glide,我使用的卡片是从“机器”页面中的用户输入创建的,我将从相册中获取或从相机中拍摄照片。所以你的意思是我需要将它上传到与数据库分开的服务器上,并将该URL保存在数据库中。这种情况是否像AWS或GCP这样的用途?还是我必须自己托管它?如果可能的话,我不想在此时进行托管。在Android实现它时,哪个平台最好使用?假设是GCP,但我不确定它是否能够做到这一点。 - Raymond Riter
好的,你不能将原始图像保存在数据库中以便稍后发送到服务器,必须在用户选择或拍摄照片后立即将图像发送到服务器。因此,在成功上传图像到服务器后更新用户信息以显示用户头像,并在此步骤中,您可以保存图像URL。 - Alireza Tizfahm Fard

2

你应该在Room DB中使用Converters类

class Converters {

@TypeConverter
fun fromBitmap(bitmap: Bitmap):ByteArray{
    val outputStream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
    return  outputStream.toByteArray()
}


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

关于数据库:

@Database(entities = [Student::class, Note::class], version = 1)
@TypeConverters(Converters::class)
abstract class StudentDatabase :RoomDatabase(){

abstract fun studentDao():StudentDAO
...

关于模型:

@ColumnInfo(name = "studentBitmap")
val studentBitmap:Bitmap?,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接