안드로이드에서는 로컬 DB로 sqlite를 사용한다. 보통 Room 라이브러리를 통해 이를 사용하는데 기본 자료형 외 사용자 정의 자료형이나 리스트 자료형 등을 저장할 때 아래와 같이 오류가 발생한다. 이를 해결하고 로컬 DB에 저장할 수 있는 방법을 알아보자.
발생 오류
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
사용자 정의 자료형을 로컬 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?
)
리스트 자료형과 같이 복잡한 자료형을 로컬 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
[Android / Kotlin] 안드로이드 14 Notification Ongoing 속성 동작 변경 (0) | 2024.03.14 |
---|---|
[Android / Kotlin] Naver, Github Oauth2 (ACCESSTOKEN 발급) (0) | 2023.04.08 |
[Android/Kotlin] Kotlin 코드에서 LinearLayout에 동적으로 Custom Layout(<include />) 추가 (0) | 2022.04.04 |
[Android/Kotlin] 문자열을 이용한 Resource 지정 (0) | 2022.03.14 |
[Android/Kotlin] Fragment에서 context 사용법 (2) | 2022.01.11 |