【发布时间】:2017-05-29 19:44:54
【问题描述】:
我在 firebase 上的数据使用了许多具有字符串类型的字段,但实际上是枚举值(我检查了我的验证规则)。要将数据下载到我的 Android 应用程序following the guide,该字段必须是基本的String。我知道我可以使用作为枚举的第二个(排除的)字段来解决这个问题,并根据字符串值进行设置。一个简短的例子:
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本身 (1) 有点长 枚举,(2)每个枚举都重复内部。而且我还有更多。 - 不只是枚举,上面的
created字段真的是一个时间戳, 不是Long。 - 每个模型都多次使用这些枚举字段,这会使模型类的代码可重复...
- 对于类型为
Map<SomeEnum, Timestamp>...的字段,辅助字段/函数变得更糟/更长了...
那么,有什么方法可以正确地做到这一点吗?也许是某个图书馆?或者以某种方式编写一个神奇的“字段包装器”,它可以自动将字符串转换为枚举,或将数字转换为时间戳,等等,但仍与用于获取/设置数据的 Firebase 库兼容?
(也欢迎 Java 解决方案 :))
【问题讨论】:
标签: java android firebase firebase-realtime-database kotlin