我正在使用 Kotlin 对象来处理我的 Firebase 数据库模型,如上所述在指南中 https://firebase.google.com/docs/database/android/read-and-write#basic_write。我有许多存储为字符串的字段,但实际上是枚举,因此为了类型安全,我在模型中有枚举字段,再加上一个返回 firebase 存储值的字符串委托属性(如建议的那样)我问的一个问题 https://stackoverflow.com/questions/41651507/firebase-clean-way-for-using-enum-fields-in-kotlin-java前一段时间)。现在,如果我在代码中获取/设置字符串委托,这些字段就可以工作,但在与数据库的 json 格式进行转换时,firebase 库似乎会跳过它们。
一个简单的例子:
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) }
The setValue
总是给出一个Permission Denied
错误,但如果我删除则有效unitEnum
字段并制作unit
一个正常的String
财产。
这与阅读类似:Firebase在获取Weight对象时没有给出错误,但是weightUnit
字段永远不会设置为默认值以外的任何值。但是,如果我手动执行weight.unit = "lb"
, the unitEnum
字段正确返回WeightUnit.LB
.
我正在使用 firebase libs v10.0.1
现在,问题是:
- 我该怎么做才能使委托属性与 firebase 一起正常工作?我可以尝试对委托枚举字段采用不同的方法,只要来自我原来的问题 https://stackoverflow.com/questions/41651507/firebase-clean-way-for-using-enum-fields-in-kotlin-java满意(可读、简洁且类型安全的代码)。
- 有什么办法可以看看如何exactlyfirebase libs 是否将对象与 json 相互转换?或者至少看到转换后的 json?也许那时我可以自己调整一些东西。不幸的是,所有与 firebase 相关的内容都显示为
/* compiled code */
在 Android Studio 中。
UPDATE: 我当然可以添加一个toMap()
方法到每个模型,我将构建一个包含 firebase 中所需的所有属性的映射,但是为每个模型执行此操作会很烦人,并且它仅解决了保存问题,在获取时仍然不会设置枚举字段。
使用 GSON 序列化时也会跳过委托的 props。那么也许有一种通用方法可以使委托属性看起来像常规字段吗?