안드로이드 앱 개발

Room Database에 기본형이 아닌 데이터 타입으로 저장하기 feat. TypeConverter 본문

안드로이드앱

Room Database에 기본형이 아닌 데이터 타입으로 저장하기 feat. TypeConverter

스텝바이스텝안드로이드 2021. 7. 10. 16:40

#1. 공식문서

https://developer.android.com/training/data-storage/room/referencing-data

 

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

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

developer.android.com

 

Room은 기본 데이터 탕비을 SQLite 데이터베이스 테이블에 쉽게 저장할 수 있지만, 이외의 다른 타입은 문제가 생길 수 있다. Crime 클래스에는 Room이 저장 방법을 모르는 Date와 UUID 타입 속성이 있다. 따라서 이런 타입의 데이터를 데이터베이스 테이블에 저장하거나 가져오는 방법을 Room에게 알려주어야 한다.

 

이 때, 방법을 알려주는 것이 '타입 변환기'이다.

1. TypeConverter 클래스 생성

package com.example.criminalintent.database

import androidx.room.TypeConverter
import java.util.*

class CrimeTypeConverters {

    @TypeConverter
    fun fromDate(date: Date?): Long? {
        return date?.time
    }

    @TypeConverter
    fun toDate(millisSinceEpoch:Long?):Date?{
        return millisSinceEpoch?.let{
            Date(it)
        }
    }

    @TypeConverter
    fun toUUID(uuid:String?):UUID? {
        return UUID.fromString(uuid)
    }

    @TypeConverter
    fun fromUUID(uuid:UUID?):String? {
        return uuid?.toString()
    }
}

2. database 클래스에 어노테이션 추가

@Database (entities = [Crime::class], version = 1)
@TypeConverters(CrimeTypeConverters::class)
abstract class CrimeDatabase: RoomDatabase() {
    abstract fun crimeDao() : CrimeDao
}

이렇게 하면, Room이 데이터를 꺼내고 저장할 때 

TypeConverter를 활용해서 기본형이 아닌 데이터타입을 저장할 수 있다.

 

위 예제에서는 기본형이 아닌 Date, UUID 타입을 Crime 클래스가 가지고 있는데, 

Date를 String으로, UUID를 String을 바꿔서 저장하고

또 가져올때는 역으로 TypeConverter를 사용한다.