Firebase上の私のデータは、文字列型のフィールドを多く使用しますが、実際には列挙型の値です(これは私の検証ルールでチェックします)。データをAndroidアプリにダウンロードするにはfollowing the guide、フィールドは基本String
である必要があります。私は列挙型である2番目のフィールド(除外されたフィールド)でこれを回避でき、このベースを文字列値に設定できることを知っています。短い例:Firebase:Kotlin/Javaで列挙型フィールドを使用するためのきれいな方法?
class UserData : BaseModel() {
val email: String? = null
val id: String = ""
val created: Long = 0
// ... more fields omitted for clarity
@Exclude
var weightUnitEnum: WeightUnit = WeightUnit.KG
var weightUnit: String
get() = weightUnitEnum.toString()
set(value) { weightUnitEnum = WeightUnit.fromString(value) }
}
enum class WeightUnit(val str: String) {
KG("kg"), LB("lb");
override fun toString(): String = str
companion object {
@JvmStatic
fun fromString(s: String): WeightUnit = WeightUnit.valueOf(s.toUpperCase())
}
}
、これは動作しますが、それは本当にきれいではありません。
enum class
自体が(2)内部が繰り返される、(1)ちょっと長い 列挙型のためにありますすべての列挙型。そして私はそれらの多くを持っています。- enumsだけでなく、上記の
created
フィールドは実際にタイムスタンプです ではなくLong
です。 - 各モデルは...
- helperフィールド/機能が大幅に悪化している/長いフィールドのためのそのような
Map<SomeEnum, Timestamp>
ようなタイプで... これらの列挙型は、反復コードとモデルクラスをbloats多くの時間を、フィールド使用しています
これを正しく行う方法はありますか?おそらくいくつかの図書館?あるいは、文字列を列挙型やタイムスタンプなどに自動的に変換する魔法の "フィールドラッパー"を書く何らかの方法ですが、データを取得/設定するためのFirebaseライブラリとはまだ互換性がありますか?
(Javaソリューションが:)あまりにも歓迎されている)
私はあなたのアドバイスに基づいて何かを実装しましたが、最終的にオブジェクトのデータベースへの保存/保存時に委任されたプロパティがFirebaseライブラリによってスキップされているようです。あなたはおそらくこれを回避する方法を考えていますか?詳細:https://stackoverflow.com/questions/42737499/firebase-db-models-with-kotlin-delegated-properties – quezak
@quezak '@ PropertyName'を使用してみてください:http://stackoverflow.com/questions/38681260/ firebase-propertyname-doesnt-work私はFirebaseの経験はありませんが、デフォルトではフィールドのみで動作するようです。 – hotkey