이 글은 기존 운영했던 WordPress 블로그인 PyxisPub: Development Life (pyxispub.uzuki.live) 에서 가져온 글 입니다. 모든 글을 가져오지는 않으며, 작성 시점과 현재 시점에는 차이가 많이 존재합니다.
작성 시점: 2018-11-19
최근 진행하고 있는 개인 프로젝트인 'どこでもゆかりん' 프로젝트에서 ObjectBox 를 중심으로 로직을 구성하는 기능이 있다.
ObjectBox에는 Converter란 개념이 있는데, ObjectBox가 지원하지 않는 타입을 사용할 경우에 지원하는 형태로 map할 수 있는 기능이다.
이 글에서는 해당 프로젝트에서 사용한 ObjectBox Converter의 베이스 형태를 작성해둔 것을 정리하려 한다.
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 할 값이다.
보통 커스텀 클래스를 다른 엔터티의 값으로 사용하려 할 때 발생한다.
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)