【问题标题】:Store multiple images in room database在房间数据库中存储多个图像
【发布时间】:2021-10-21 00:42:12
【问题描述】:

我有一个项目需求,比如想在房间数据库中存储多个图像。所以从服务器端我得到了图像 URL,所以当我下载图像时,我只想将图像存储在房间数据库中,我总共有 25 张图像。将图像保存到数据库后,在其他片段中希望显示这些所有图像以用于向左或向右滑动功能。

对于这 25 张图片,我有一个唯一的 ID,每张图片都有不同的名称。

我第一次集成房间数据库,我该如何实现呢?我经历了许多 SO 答案,但没有得到正确的想法。

请指导我。任何帮助表示赞赏。

【问题讨论】:

  • 不清楚您在哪里需要帮助。您可以将一张图像存储在房间数据库中吗?
  • 我的问题也一样。你没有回答我的问题 。请重新阅读我的评论并回答问题。
  • @blackapps 不...我是这个房间数据库实施的新手。我不知道如何将图像存储在数据库中。
  • 那么你为什么不问如何存储一张图片呢?为什么要谈论下载和多个图像?忘记这篇文章并发布一个新问题。一旦您可以存储一个图像,您就可以存储两个和多个。并寻求具体帮助。
  • 你应该做一些研究:stackoverflow.com/questions/46337519/…

标签: android image kotlin download android-room


【解决方案1】:

不建议将文件存储在 SQLite 中。如您所知,房间工作基于 SQLite。在您的情况下,我认为将图像保存在内部存储中(最好保存在文件夹中,因为缓存文件夹将在设备存储已满时被格式化)然后将文件的名称或地址保存在数据库列中,并且每次您需要图像时可以从 db 读取地址,然后你想要什么。

【讨论】:

    【解决方案2】:

    如果您不想处理权限,可以使用此方法,因为如果用户拒绝权限,您将无法将图像保存到文件夹中。

    您不能直接将图像位图保存在房间数据库中,但您可以通过将位图转换为 ByteArray 来存储它,您可以使用房间数据库提供的类型转换注释,您可以使用它以您想要的格式传递对象,但是Room Database 会将其存储在它接受的类型中。要创建类型转换器,你必须像这样创建一个新的类,

    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)
    }
    }
    

    然后在 Top of Room Database Class 上添加 @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
    )
    

    现在您将 Bi​​tmap 传递给 Entity,然后 Room Database 会将其转换为 ByteArray 并存储它,并且每当您要检索数据库时,您都会得到 Bitmap。

    【讨论】:

    • 将图像文件转换为位图然后将位图压缩为字节数组中的 png 文件非常糟糕。如果要存储字节数组,最好将图像文件直接放在字节数组中。
    【解决方案3】:

    正如 Vaibhav 所说,我已尝试将图像存储在房间数据库中。但是你迟早肯定会遇到这样的 Room 光标错误

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

    在 android 中必须将图像存储在范围存储中,因此无需获得任何权限并将该图像的路径保存在 Room 数据库中。 glide 将使您的工作变得轻松。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 2020-05-20
      • 1970-01-01
      • 2022-11-14
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多