“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”
Room을 사용하여 이미지(Bitmap)이나 Uri를 저장해야 할 때가 있다.
이때 바로 저장하려고 하면 스튜디오에서 시뻘건 에러를 뿜어낸다.
이때 Converter 클래스를 만들어서 RoomDatabase에 탑재해주어야 한다.
여기서 Converter 클래스란 말 그대로 데이터 타입을 변환해주는 클래스이다.
이를테면 Uri는 String으로 변환되어야하고
Bitmap은 ByteArray로 변환되어 저장해야하는데
이를 Converter 클래스로 한번만 작성하면
Room이 알아서 변환을 거쳐서 저장해준다.
먼저 Converter 클래스를 살펴보자
class Converters {
@TypeConverter
fun toByteArray(bitmap: Bitmap) : ByteArray {
val outputStream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
return outputStream.toByteArray()
}
@TypeConverter
fun toBitmap(bytes: ByteArray) : Bitmap {
return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
}
@TypeConverter
fun toUri(value: String) : Uri {
return Uri.parse(value)
}
@TypeConverter
fun toString(uri: Uri) : String {
return uri.toString()
}
}
Bitmap의 경우
toByteArray
와 toBitmap
을 구현하면 되고
Uri의 경우
toUri
와 toString
을 구현해주면 된다.
그리고 구현한 메소드 위에 @TypeConverter
어노테이션을
반드시 달아줘야한다.
@Database(entities = [PhotoEntity::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class PmDatabase : RoomDatabase() {
~~ 중략 ~~
}
Converter 클래스를 작성했다면 이제 Roomdatabase에 탑재해주면 된다.
@TypeConverters
어노테이션을 사용해서 Converter 클래스를 지정해주면 된다.
개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.