web-dev-qa-db-ja.com

列挙型はレルムでサポートされますか?

私はAndroidアプリとレルムに取り組んでおり、オブジェクトの1つに列挙型属性を作成する必要がありますが、これで発見しました post レルムはまだ列挙型をサポートしていません。

私のオブジェクトは次のとおりです:

public class ShuttleOption extends RealmObject {
    private int Id;
    private String Label;
    private ShuttleTypes OriginShuttleType;
}

私の列挙型クラス(ShuttleTypes)は以下に対応します:

HOME = 1;  

そして

WORK = 2;

誰か私にそれを行う方法を提案できますか?

16
MJB22

問題で説明されているパターンを使用できます: 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);
  }
}
31

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アノテーションを使用する必要はありません

5

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)
    }
}
0
Eric