尝试使用 TypeConverter 将位图保存到房间数据库时出错

问题描述

我目前正在尝试将位图图像保存到 ROOM 数据库,但是当我尝试运行我的应用程序时,我不断收到此错误

> Task :app:kaptDebugKotlin
C:\Users\xinyu\AndroidStudioProjects\Red\app\build\tmp\kapt3\stubs\debug\com\google\gradient\red\data\models\JournalData.java:20: error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
    private android.graphics.Bitmap image;
                                    ^[WARN] Incremental annotation processing requested,but support is disabled because the following processors are not incremental: androidx.room.RoomProcessor (DYNAMIC).

从查看其他 StackOverflow 问题来看,我遇到的问题似乎是我使用了错误的类型,但我不确定如何更改转换器以使其正常工作。任何帮助将不胜感激!

这是我的代码(相关部分):

Converter.kt

class Converter {

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

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

UpdateFragment.kt

override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_update,container,false)

        // set menu
        setHasOptionsMenu(true)

        view.current_title_et.setText(args.currentItem.title)
        view.current_description_et.setText(args.currentItem.description)
        view.current_mood_spinner.setSelection(mSharedviewmodel.parseMood(args.currentItem.mood))
        view.current_mood_spinner.onItemSelectedListener = mSharedviewmodel.listener

        // Opens gallery when image button clicked,gets image
        view.current_image_et.setonClickListener {
            val intent = Intent(Intent.ACTION_PICK)
            intent.type = "image/*"
            startActivityForResult(intent,1218)
        }

        return view
    }

    // Handle result of picked image
    override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
        if (resultCode == Activity.RESULT_OK && requestCode == 1001) {

            // Converts image URI to bitmap
            if (data != null && data.data != null) {
                val uri = data.data!!
                val inputStream = requireContext().contentResolver.openInputStream(uri)
                val cursor = requireContext().contentResolver.query(uri,null,null)
                cursor?.use { c ->
                    val nameIndex = c.getColumnIndex(OpenableColumns.disPLAY_NAME)
                    if (c.movetoFirst()) {
                        val name = c.getString(nameIndex)
                        inputStream?.let { inputStream ->
                            // create same file with same name
                            val file = File(requireContext().cacheDir,name)
                            val os = file.outputStream()
                            os.use {
                                inputStream.copyTo(it)
                            }
                            bitmap = BitmapFactory.decodeFile(file.absolutePath)
                            preview_image.setimageBitmap(bitmap)
                        }
                    }
                }
            }
        }
    }

解决方法

我最终解决了这个问题,结果证明这是一个非常简单的错误。

在我的转换器代码中,

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

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

我忘记在我的 @TypeConverter 函数中添加 toBitmap 注释。

,

您可以将其转换为字节数组并将其存储在您的数据库中,当您想使用它时,您可以将其改回位图