안드로이드/개발 공부

[Android/Kotlin] Room 이용 로컬 DB에 사용자 정의 자료형 및 리스트 추가(@Embed, @TypeConverter)

감자 바보 2022. 4. 6. 16:49
반응형

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)

 

[안드로이드] Room 로컬 데이터베이스에서 기본형이 아닌 객체 필드값 저장방법 (feat. @Embeded, @TypeC

[2021-04-14 업데이트]  [2020.12.16 블로그 포스팅 스터디 3 번째 글] github.com/mtjin/NoMoneyTrip mtjin/NoMoneyTrip [SKT/한국관광공사] 2020 스마트 관광 앱 개발 공모전 '무전여행' 앱. Contribute to mtj..

youngest-programming.tistory.com

객체 간 관계 정의  |  Android 개발자  |  Android Developers

 

객체 간 관계 정의  |  Android 개발자  |  Android Developers

객체 간 관계 정의 SQLite는 관계형 데이터베이스이므로 항목 간 관계를 정의할 수 있습니다. 대부분의 객체 관계 매핑(ORM) 라이브러리에서는 항목 객체가 서로를 참조할 수 있지만, Room은 이러한

developer.android.com

Room을 사용하여 복잡한 데이터 참조  |  Android 개발자  |  Android Developers

 

Room을 사용하여 복잡한 데이터 참조  |  Android 개발자  |  Android Developers

Room을 사용하여 복잡한 데이터 참조 Room은 기본 유형과 박싱된 유형 간 변환을 위한 기능을 제공하지만 항목 간 객체 참조는 허용하지 않습니다. 본 문서에서는 유형 변환기를 사용하는 방법 및

developer.android.com