[Android/Kotlin] Room 이용 로컬 DB에 사용자 정의 자료형 및 리스트 추가(@Embed, @TypeConverter)
Room 이용 로컬 DB에 사용자 정의 자료형 및 리스트 추가(@Embed, @TypeConverter)
안드로이드에서는 로컬 DB로 sqlite를 사용한다. 보통 Room 라이브러리를 통해 이를 사용하는데 기본 자료형 외 사용자 정의 자료형이나 리스트 자료형 등을 저장할 때 아래와 같이 오류가 발생한다. 이를 해결하고 로컬 DB에 저장할 수 있는 방법을 알아보자.
발생 오류
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
사용자 정의 자료형 추가 (@Embeded)
사용자 정의 자료형을 로컬 DB에 추가하려 할 때, 해당하는 필드 앞에 @Embeded를 추가한다. 단 사용자 정의 자료형 내부에 리스트 자료형이 존재할 시 추가 작업이 필요하다.
예제코드
코드 출처 : 객체 간 관계 정의 | Android 개발자 | Android Developers
data class Address(
val street: String?,
val state: String?,
val city: String?,
@ColumnInfo(name = "post_code") val postCode: Int
)
@Entity
data class User(
@PrimaryKey val id: Int,
val firstName: String?,
@Embedded val address: Address?
)
리스트 추가 (@TypeConverter)
리스트 자료형과 같이 복잡한 자료형을 로컬 DB에 추가하려 할 때, 자료형을 변환하는 TypeConverter를 제공해야한다. @TypeConverter 어노테이션을 사용하고 컨버터 메소드를 구현하여사용한다. Gson() 라이브러리를 통해 리스트를 json 형태로, json을 리스트 형태로 변환하는 식으로 구현할 수 있다.
아래는 Boolean과 Int리스트에 대한 예제코드이다. 구현한 타입컨버터 클래스는 db에 등록해주어야한다.
예제코드
TypeConverters
class MyTypeConverters {
@TypeConverter
fun fromBooleanList(value: List<Boolean>?): String = Gson().toJson(value)
@TypeConverter
fun toBooleanList(value: String) = Gson().fromJson(value, Array<Boolean>::class.java).toList()
@TypeConverter
fun fromIntList(value: List<Int>?): String = Gson().toJson(value)
@TypeConverter
fun toIntList(value: String) = Gson().fromJson(value, Array<Int>::class.java).toList()
}
DB 등록
@Database(entities = [MyLottoResultEntity::class, MyPensionResultEntity::class], version = 1)
@TypeConverters(MyTypeConverters::class)
abstract class MyLotteryDatabase: RoomDatabase() {
abstract fun myLottoResultDao(): LottoResultDao
abstract fun myPensionResultDao(): PensionResultDao
}
참고
[안드로이드] Room 로컬 데이터베이스에서 기본형이 아닌 객체 필드값 저장방법 (feat. @Embeded, @TypeConverter) (tistory.com)
객체 간 관계 정의 | Android 개발자 | Android Developers
Room을 사용하여 복잡한 데이터 참조 | Android 개발자 | Android Developers