【问题标题】:How to store and retrieve image from room database如何从房间数据库中存储和检索图像
【发布时间】:2020-01-02 11:55:30
【问题描述】:

我正在构建一个博客应用程序,允许用户为博客文章添加图片。我目前将数据存储为 URI 字符串,但我遇到的问题是图像仅在我第一次添加时显示,如果我刷新页面或重新启动应用程序,图像将不会显示,只是一个没有图像的空白区域。

数据库实体

@Entity
class PostEntity(
    var title: String,
    var body: String,
    var image: String? = null,
    var date: String?

): Serializable {

    @PrimaryKey(autoGenerate = true)
    var id: Int = 0

    var likes:Int? = 0



}

从图库和相机中捕获图像并转换为 URI 字符串

    private fun openCamera(){
        try{
            val CAMERA_REQUEST = 200
            val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
            startActivityForResult(intent, CAMERA_REQUEST)
        }
        catch (e:Exception){
            Toast.makeText(context, "Please try again: ${e.message}", Toast.LENGTH_SHORT).show()
        }

    }

// function to be called in onActivityResult
    private fun loadImage(requestCode: Int, imageView: ImageView, context: Context, data: Intent?){
        if(requestCode == 200){
            try{

                val image = data!!.extras?.get("data") as Bitmap


                imageView.setImageBitmap(image)
                imageView.visibility = View.VISIBLE

                imageUriLoader = getImageUriFromBitmap(context, image)
            }
            catch (e:Exception){
                Toast.makeText(context, "Please try againt: ${e.message}", Toast.LENGTH_SHORT).show()
            }

        }

        else if(requestCode == 201){
            try{
                val imageUri = data!!.data
                imageUriLoader = imageUri
                Picasso.get().load(imageUri).into(imageView)

                imageView.visibility = View.VISIBLE
                imageView.setImageURI(imageUri)

            }
            catch (e:Exception){
                Toast.makeText(context, "Please try again: ${e.message}", Toast.LENGTH_SHORT).show()
            }

        }
        else{
            Toast.makeText(context, "Invalid request", Toast.LENGTH_SHORT).show()
        }
    }

我看过一些关于使用 blob 的帖子,其中大多数都不清楚,而且 blob 只允许 1MB 的图像大小限制这一事实使得想要一个更好的选择。 请帮助更好地保存和恢复图像。

【问题讨论】:

  • 我建议将其转换为Base64并存储在房间中,或者您可以将其路径存储在db中
  • 图像不应存储在数据库中。相反,它们必须作为文件存储在设备上,并且它们对应的路径必须存储在数据库中
  • @AtishAgrawal 请协助如何做到这一点
  • @Ashish 请帮忙。
  • 如果您使用 base 64,我提供了如何转换和获取 base64 字符串并存储在数据库中的链接。

标签: java android kotlin android-room


【解决方案1】:

在您的数据库中,您应该有一个字符串类型的字段(或等效的 VARCHAR 等),用作您选择的目录中的图像路径,例如

然后您可以添加您需要的任何字段,例如,在您的情况下,您需要一个 userID 作为登录用户的外键。 因此,一旦用户加载图像,您将文件保存到您想要的路径,然后将相同的路径保存在数据库中,以便下次用户登录时查找他的图像路径,然后将其加载到网页上。

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2021-10-21
    • 2020-05-20
    • 2010-12-10
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多