TypeConverter

지프치프·2022년 12월 14일
0

Android

목록 보기
59/85
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


개요

Room을 사용하여 이미지(Bitmap)이나 Uri를 저장해야 할 때가 있다.
이때 바로 저장하려고 하면 스튜디오에서 시뻘건 에러를 뿜어낸다.
이때 Converter 클래스를 만들어서 RoomDatabase에 탑재해주어야 한다.
여기서 Converter 클래스란 말 그대로 데이터 타입을 변환해주는 클래스이다.

이를테면 Uri는 String으로 변환되어야하고
Bitmap은 ByteArray로 변환되어 저장해야하는데
이를 Converter 클래스로 한번만 작성하면
Room이 알아서 변환을 거쳐서 저장해준다.

TypeConverter

먼저 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의 경우
toByteArraytoBitmap을 구현하면 되고

Uri의 경우
toUritoString을 구현해주면 된다.

그리고 구현한 메소드 위에 @TypeConverter 어노테이션을
반드시 달아줘야한다.

RoomDatabase

@Database(entities = [PhotoEntity::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class PmDatabase : RoomDatabase() {
	~~ 중략 ~~
}

Converter 클래스를 작성했다면 이제 Roomdatabase에 탑재해주면 된다.
@TypeConverters 어노테이션을 사용해서 Converter 클래스를 지정해주면 된다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글