프로그래밍 놀이터/안드로이드, Java

[android] Referencing complex data using Room - Room 에 대해 알아보자

돼지왕 왕돼지 2021. 5. 5. 12:58
반응형

-

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

 

 

 

반응형