ObjectBox Converter 베이스 모음집

도입

최근 진행하고 있는 개인 프로젝트인 ‘どこでもゆかりん’ 프로젝트에서 ObjectBox 를 중심으로 로직을 구성하는 기능이 있다.

ObjectBox에는 Converter란 개념이 있는데, ObjectBox가 지원하지 않는 타입을 사용할 경우에 지원하는 형태로 map할 수 있는 기능이다.

이 글에서는 해당 프로젝트에서 사용한 ObjectBox Converter의 베이스 형태를 작성해둔 것을 정리하려 한다.

Enum

import io.objectbox.converter.PropertyConverter

open class PropertyEnumConverter<T, R>(private val values: Array<T>, private val default: T,
                                       private val predicate: T.(R) -> Boolean,
                                       private val supplier: (T) -> R?) : PropertyConverter<T, R> {

    override fun convertToEntityProperty(databaseValue: R?): T? {
        if (databaseValue == null) return null
        for (state in values) {
            if (state.predicate(databaseValue)) {
                return state
            }
        }
        return default
    }

    override fun convertToDatabaseValue(entityProperty: T?): R? {
        if (entityProperty == null) return null
        return supplier(entityProperty)
    }
}
 class VoiceEngineConverter : PropertyEnumConverter<VoiceEngine, String>(
        VoiceEngine.values(),
            NONE, { this.id == it }, { it.id })

첫 번째 파라미터에는 해당 Enum의 전체값, 두 번쨰 파라미터에는 값이 없을 때의 기본값, 세번째는 Enum과 db에 있는 값을 map 할 때 사용할 조건, 마지막 네번째 필드는 map 할 값이다.

Json

보통 커스텀 클래스를 다른 엔터티의 값으로 사용하려 할 때 발생한다.

import com.google.gson.Gson
import io.objectbox.converter.PropertyConverter

open class PropertyJsonConverter<T>(private val cls: Class<T>) : PropertyConverter<T, String> {
    override fun convertToEntityProperty(databaseValue: String?): T? {
        if (databaseValue == null) return null
        return Gson().fromJson(databaseValue, cls) as T
    }

    override fun convertToDatabaseValue(entityProperty: T?): String? {
        if (entityProperty == null) return null
        return Gson().toJson(entityProperty)
    }
}
class PresetItemConverter : PropertyJsonConverter<PresetItem>(PresetItem::class.java)