firebase db:具有Kotlin委托属性的模型

时间:2017-03-11 16:14:35

标签: android firebase firebase-realtime-database kotlin

我正在使用Kotlin对象来使用我的Firebase数据库模型,如in the guide所述。我有很多字段存储为字符串,但实际上是枚举,所以为了类型安全,我在模型中有枚举字段,加上一个返回firebase存储值的字符串委托属性(如a question I asked中所述过去)。现在,如果我在代码中获取/设置字符串委托,这些字段可以工作,但是当转换为数据库的json格式时,firebase libs似乎跳过它们。

一个简单的例子:

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错误,但如果我删除unitEnum字段并使unit成为正常String属性,则会有效。

与阅读类似:Firebase在获取Weight对象时不会出错,但weightUnit字段永远不会设置为默认值以外的任何值。但是,如果我手动执行weight.unit = "lb",则unitEnum字段会正确返回WeightUnit.LB

我正在使用firebase libs v10.0.1

现在,问题:

  • 如何使委托属性与firebase一起正常工作?只要满足my original question中的点(可读,简洁且类型安全的代码),我就可以对委派的枚举字段尝试不同的方法。
  • 有没有办法看看完全如何将firebase库转换为json对象?或者至少看到转换后的json?也许那时我可以自己调整一下。不幸的是,所有与firebase相关的内容都显示为AndroidStudio中的/* compiled code */

更新:我当然可以为每个模型添加一个toMap()方法,在这里我将构建一个包含firebase中所需的所有属性的地图,但这样做会很烦人对于每个模型,它只解决了保存问题,枚举字段在获取时仍然无法设置。

使用GSON进行序列化时,也会跳过委派的道具。那么是否有一种通用的方法可以使委托属性看起来像常规字段?

1 个答案:

答案 0 :(得分:0)

尝试使用此代码,它应该可以正常工作。

@get:Exclude @set:Exclude
var unitEnum: WeightUnit = WeightUnit.KG
var unit: String
    get() = unitEnum.name
    set(v) { unitEnum = WeightUnit.valueOf(v) }