问题描述
我目前正在尝试将位图图像保存到 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
注释。
您可以将其转换为字节数组并将其存储在您的数据库中,当您想使用它时,您可以将其改回位图