in the guideと記載されているように、私はFirebaseデータベースモデルで作業するためにKotlinオブジェクトを使用しています。私は文字列として格納されている多くのフィールドを持っていますが、実際には列挙型ですので、型の安全性を保つためにモデルの列挙型フィールドとfirebaseの格納された値を返す文字列代理プロパティ(a question I asked)コードで文字列デリゲートを取得/設定すると、これらのフィールドが機能しますが、firebaseのlibsはデータベースのjson形式から/に変換するときにスキップするように見えます。firebase db:Kotlin代理プロパティを持つモデル
簡単な例:私はunitEnum
フィールドを削除し、unit
通常String
財産を作る場合
abstract class BaseModel {
@Exclude
open var path: String? = null // fails even if I delete this field!
}
class Weight() : BaseModel() {
constructor(v: Double, u: WeightUnit) : this() {
value = v
unitEnum = u
}
var value: Double = 0.0
@Exclude
var unitEnum: WeightUnit = WeightUnit.KG
var unit: String by EnumStringLowercaseConverter(WeightUnit::class.java).getDelegate(Weight::unitEnum)
}
[...]
val testWeight = Weight(7.0, "kg")
db.getReference("/valid/path/to/save/testWeight").setValue(testWeight)
.addOnSuccessListener { r -> Log.d(LOG_TAG, "set successful") }
.addOnFailureListener { e -> Log.e(LOG_TAG, "set error", e) }
setValue
は常に、Permission Denied
エラーを与えるが、動作します。
これは似ています:Weightオブジェクトを取得するときFirebaseはエラーを発生しませんが、weightUnit
フィールドはデフォルト以外に設定されません。しかし、手動でweight.unit = "lb"
を実行すると、unitEnum
フィールドは正しくWeightUnit.LB
を返します。
私は今firebase LIBS v10.0.1
を使用しています、質問:
- 私は委任プロパティがfirebaseで正しく動作させるために何ができますか? my original questionからのポイント(読み取り可能、簡潔で型付き安全なコード)が満たされている限り、委任されたenumフィールドに対して別のアプローチを試みることができます。
- どのようにすればがfirebase libsからオブジェクトをjsonに/から変換するのですか?または少なくとも変換されたjsonを参照してください?多分私は自分自身を微調整することができました。残念ながら、firebase関連のものはすべてAndroidStudioの
/* compiled code */
と表示されます。
UPDATE:私はもちろん、私はfirebaseに必要なすべてのプロパティを含むマップを構築するだろう各モデルにtoMap()
メソッドを追加することができますが、すべてのモデルのためにこれを行うことが面倒になり、それ保存の問題のみを解決しますが、enumフィールドは取得時に設定されません。
GSONを使用してシリアル化すると、委任された小道具もスキップされます。だから、委任されたプロパティを通常のフィールドのように見せるための一般的な方法はありますか?
GSONでは、シリアライズ関数や代理人の拡張子getter/settersが許可されていません。考えられる解決策の1つはunitEnumをデリゲートにすることです。このデリゲートを更新すると単位文字列も更新されます。 'var unitEnum:EnumStringUpdateによるWeightUnit(WeightUnit :: class.java).getDelegate(Weight :: unit)' – Ritave
':: class.java'は廃止され、' .javaClass'を使用します –