2017-10-04 2 views
1

Ist es möglich, Int/Long zu enumerieren? Zuvor mein Modell sah etwa so aus:Firebase Database serialisieren int zu enum?

class A(var style: Int = STYLE_NORMAL) : Parcelable, Observable{...} 

Wo Stil Wert könnte entweder

const val STYLE_NORMAL : Int = 0 

oder

const val STYLE_CUSTOM : Int = 1 

Jetzt habe ich beschlossen, dass es besser ist, wenn ich es wickeln mit enum.

enum class Style { 
    @SerializedName("0") NORMAL, 
    @SerializedName("1") CUSTOM 
} 

So jetzt mein Modell wie folgt aussehen:

class A(var style: Style = Style.NORMAL) : Parcelable, Observable{...} 

Und alles funktioniert gut, außer dass Firebase cann't bereits Objekte auf Vorgängermodell auf den neuen gespeicherten parsen und diese Linie

snapshot.getValue(A::java.class) 

wirft Ausnahme

E/UncaughtException: com.google.firebase.database.DatabaseException: Erwartet ein String während Deserialisieren Klasse com.stasbar.models.A $ Style Enum bekam aber eine Klasse java.lang.Long

Ich verstehe, dass das Problem ist, dass Firebase nur Strings zu Enums analysieren kann. Gibt es eine Problemumgehung?

Antwort

1

Momentan verwende ich eine Problemumgehung, die @IntDef Annotation anstelle von Aufzählung verwendet. Aber ich werde die Frage Enum Lösung offen halten

@Retention(AnnotationRetention.SOURCE) 
@IntDef(Style.NORMAL, Style.CUSTOM) 
annotation class StyleDef 


object Style { 
    const val NORMAL: Long = 0 
    const val CUSTOM: Long = 1 
} 

und mein Modell werden

class A(@StyleDef var style: Long = Style.NORMAL) : Parcelable, Observable{...}