[android] Referencing complex data using Room - Room 에 대해 알아보자
-
Room 은 primitive 와 boxed type 에 대한 converting 기능을 제공한다.
그렇지만 object reference 에 대한 converting 은 제공하지 않는다.
Use type converters
-
Single db column 에 custom data type 을 mapping 하고 싶을 때가 있을 것이다.
이 기능을 지원하기 위해서는 TypeConverter 를 제공해야 하는데, 이 녀석은 custom class 를 Room 이 아는 type 으로 변환하는 기능을 제공한다.
예를 들어 Date 를 TypeConverter 를 통해 Unix timestamp 형태로 변환할 수 있다.
class Converters{
@TypeConverter
fun fromTimestamp(value: Long?): Date?{
return value?.let{ Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long?{
return date?.time?.toLong()
}
}
-
이제 AppDatabase class 에 @TypeConverters annotation 을 추가해서 이 converter 를 지정해주면 된다.
@Database(entities = arrayOf(User::class), version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase(){
abstract fun userDao(): UserDao
}
이렇게 하면 converter 로 converting 할 수 있는 녀석들은 primitive type 처럼 그냥 사용하면 된다.
-
@TypeConverters 는 다른 scope 에 적용될 수도 있다.
각각의 entity 에 해도 되고, DAO 에 해도 되고, DAO method 에 해도 된다.
Understand why Room doesn’t allow object references
-
Room 은 entity class 간의 referencing 을 지원하지 않는다.
필요시 각각의 데이터를 쿼리해야 한다.
-
이는 relationship 지정과 lazy loading 에 관련이 있는데..
이전 글 참조!!!
-
참고자료
https://developer.android.com/training/data-storage/room/referencing-data