我正在使用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
现在,问题:
/* compiled code */
。 更新:我当然可以为每个模型添加一个toMap()
方法,在这里我将构建一个包含firebase中所需的所有属性的地图,但这样做会很烦人对于每个模型,它只解决了保存问题,枚举字段在获取时仍然无法设置。
使用GSON进行序列化时,也会跳过委派的道具。那么是否有一种通用的方法可以使委托属性看起来像常规字段?
答案 0 :(得分:0)
尝试使用此代码,它应该可以正常工作。
@get:Exclude @set:Exclude
var unitEnum: WeightUnit = WeightUnit.KG
var unit: String
get() = unitEnum.name
set(v) { unitEnum = WeightUnit.valueOf(v) }