web-dev-qa-db-fra.com

Enums support avec Realm?

Je travaille sur une Android et domaine, et je dois créer un attribut enum pour l'un de mes objets; mais j'ai découvert dans ce post que le domaine ne fonctionne pas 't support enum encore.

Mon objet est comme ça:

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

et ma classe d'énumération (ShuttleTypes) correspond à:

HOME = 1;  

et

WORK = 2;

Quelqu'un peut-il me suggérer comment le faire?

16
MJB22

Vous pouvez utiliser le modèle décrit dans le problème: https://github.com/realm/realm-Java/issues/776#issuecomment-190147079

Fondamentalement, enregistrez-le en tant que chaîne dans Realm et convertissez-le en entrant et en sortant:

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
Christian Melchior

Si vous avez besoin d'une solution qui fonctionne sur Kotlin, vous pouvez utiliser ce qui suit:

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 est l'énumération déclarée dans la réponse @ChristianMelchior.

Il convient de mentionner que puisque enum n'a pas de champ de support, il ne sera pas conservé dans Realm. Il n'est pas nécessaire d'utiliser le @Ignore annotation dessus

5
Nicolás Carrasco

j'ai créé un délégué Kotlin, ce qui signifie un peu moins de répétition

usage:

open class SomeDbModel : RealmObject() {

    @delegate:Ignore
    var variableEnum: MyEnum by enum(::variable)
    private var variable: String = MyEnum.Default.name
}

mise en œuvre déléguée:

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