私はAndroidアプリとレルムに取り組んでおり、オブジェクトの1つに列挙型属性を作成する必要がありますが、これで発見しました post レルムはまだ列挙型をサポートしていません。
私のオブジェクトは次のとおりです:
public class ShuttleOption extends RealmObject {
private int Id;
private String Label;
private ShuttleTypes OriginShuttleType;
}
私の列挙型クラス(ShuttleTypes)は以下に対応します:
HOME = 1;
そして
WORK = 2;
誰か私にそれを行う方法を提案できますか?
問題で説明されているパターンを使用できます: https://github.com/realm/realm-Java/issues/776#issuecomment-190147079
基本的にはそれを文字列としてレルムに保存し、それを内外に変換します。
public enum MyEnum {
FOO, BAR;
}
public class Foo extends RealmObject {
private String enumDescription;
public void saveEnum(MyEnum val) {
this.enumDescription = val.toString();
}
public MyEnum getEnum() {
return MyEnum.valueOf(enumDescription);
}
}
Kotlinで動作するソリューションが必要な場合は、以下を使用できます。
open class Foo: RealmObject() {
var enum: MyEnum
get() { return MyEnum.valueOf(enumDescription) }
set(newMyEum) { enumDescription = newMyEnum.name }
private var enumDescription: String = MyEnum.FOO.name
}
MyEnum
は@ChristianMelchiorの回答で宣言された列挙型です。
enum
にはバッキングフィールドがないため、レルムに永続化されないことに注意してください。 @Ignore
アノテーションを使用する必要はありません
kotlinデリゲートを作成しました。つまり、繰り返しが少し少なくなりました
使用法:
open class SomeDbModel : RealmObject() {
@delegate:Ignore
var variableEnum: MyEnum by enum(::variable)
private var variable: String = MyEnum.Default.name
}
デリゲートの実装:
package com.github.ericytsang
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KClass
import kotlin.reflect.KMutableProperty0
import kotlin.reflect.KProperty
inline fun <R, reified T : Enum<T>> enum(
backingField: KMutableProperty0<Int>
) = OrdinalToEnumDelegate<R, T>(T::class, backingField)
val <T : Enum<T>> KClass<out T>.enumValues get() = Java.enumConstants!!.toList()
class StringToEnumDelegate<R, T : Enum<T>>(
/**
* enum class to convert the ordinal values in [backingField] to.
*/
enumClass: KClass<T>,
/**
* the property containing [T]'s ordinal value.
*/
private val backingField: KMutableProperty0<String>
) : ReadWriteProperty<R, T> {
private val enumValues = enumClass.enumValues.associateBy { it.name }
override fun getValue(thisRef: R, property: KProperty<*>): T {
return enumValues[backingField.get()]
?: error("no corresponding enum found for ${backingField.get()} in ${enumValues.keys}")
}
override fun setValue(thisRef: R, property: KProperty<*>, value: T) {
backingField.set(value.name)
}
}