-
Android) Room에서 List 또는 객체를 필드에 저장하는법 feat) @Embeded @TypeConverterAndroid 2021. 2. 19. 15:43
안드로이드를 개발하면서 로컬 데이터베이스인 Room을 자주 사용하는데, 컬럼에 List나 객체를 저장하려고 하면 에러가 발생합니다.
- Room은 primitive 타입(short, int, long, float, double, byte, char, boolean)과 그 wrapping 타입(primitve 타입을 객체로 한번 감싼 클래스)만 지원합니다.
Room에서 객체 참조를 허용하지 않는 이유
클라이언트 측에서는 이 유형의 지연 로드가 일반적으로 UI 스레드에서 발생하기 때문에
실행 가능하지 않으며 UI 스레드에서 디스크에 관한 정보를 쿼리하면 상당한 성능 문제와 메모리 문제가 발생하기 때문입니다.
그럼 어떻게 해야 할까요?
- @Embeded 사용하여 테이블 내의 하위 필드로 분해하여 사용하기
- @TypeConverter를 사용하여 복잡한 데이터 참조하기
Usage
@Embeded
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
class Converters { @TypeConverter fun fromTimestamp(value: Long?): Date? { return value?.let { Date(it) } } @TypeConverter fun dateToTimestamp(date: Date?): Long? { return date?.time?.toLong() } }
Converters 클래스를 만든 후에 @TypeConverter 어노테이션으로 상호 변환해줍니다.
그런 후에 Database 클래스에 @TypeConverters 어노테이션을 추가합니다.
Database
@Database(entities = arrayOf(User::class), version = 1) @TypeConverters(Converters::class) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
반응형'Android' 카테고리의 다른 글
Android) Device 실제 사이즈 구하기 (feat - display, getRealMetrics) (0) 2021.04.08 Android) State 패턴을 통해서 UI 상태 관리하기 (0) 2021.02.26 Android) asStateFlow() 메소드 알아보기 (0) 2021.02.17 Android) Jetpack Paging 3 라이브러리 알아보기 (0) 2021.02.16 Android) Airbnb에서 만든 MvRx 알아보기 (0) 2021.02.15