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?
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);
}
}
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
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)
}
}