从 Firebase 数据库快照解析布尔值
Posted
技术标签:
【中文标题】从 Firebase 数据库快照解析布尔值【英文标题】:Parsing boolean from Firebase Database Snapshot 【发布时间】:2019-11-01 23:58:25 【问题描述】:我在使用 ProGuard 将 Firebase 实时数据库中的快照粘贴到 Kotlin 中的数据类时遇到问题。
数据在 Firebase 控制台中的显示如下:
这是我在我的 android 应用中对该数据类进行建模的方式:
data class PickupCode(
val code: String,
val boxId: String,
val orderId: String,
val suborderId: String,
val drawers: List<Int>,
val isDelivered: Boolean
)
constructor(): this("", "", "","", emptyList(), false)
override fun toString(): String
return code
以下是我构建数据库请求的方式:
val reference = database.getReference("pickupCodes/$boxId/$code")
val listener = object : ValueEventListener
override fun onDataChange(snapshot: DataSnapshot)
if (snapshot.exists())
println(snapshot)
val pickupCode = snapshot.getValue<PickupCode>(PickupCode::class.java)
pickupCode?.let
println("Code: $it.code, is delivered: $it.isDelivered to drawers: $it.drawers.toString()")
if (!it.isDelivered)
// No success
else
// Success!
?: run
// No success
else
// No success
override fun onCancelled(error: DatabaseError)
// No success
这是println(snapshot)
行打印的内容:
DataSnapshot key = 320625, value = isDelivered=true, code=320625, drawers=0=2, orderId=-LhdzXS4-gyT0ysNe-zi, suborderId=-LhdzYhT78y9b3iJcyrb, boxId=box_1
这就是下一个 print 3 lines lates 打印的内容:
代码:320625,交付:false 到抽屉:[2]
在这里我希望is delivered
是true
,但由于某种原因,快照中isDelivered
的true
-value 在将快照解析为PickupCode
-class 时会被忽略。 PickupCode
的值isDelivered
等于类的空构造函数。
但是为什么以及如何解决?
快照中的所有其他值都会被正确解析。我是 android 新手,但我有一种预感,ProGuard(不管那是什么)在这里有一些责任。这是我的设置方式:
-keepattributes Signature
-keepclassmembers class PickupCode.**
*;
【问题讨论】:
println("Code: $it.code, is delivered: $it.isDelivered to drawers: $it.drawers.toString()")
中的isDelivered
的值是多少?与println(snapshot)
中的相同?
Nope :/ 那就是下面引用中提到的那个。这是false
..
但是如果你尝试在pickupCode?.let
块之外打印it.isDelivered
,值是多少?
我找到了解决办法,见下文:)
很高兴听到这个消息 :) 我回答了一个类似的问题here。
【参考方案1】:
我找到了解决方案.. 检查详细日志时,我发现:
W/ClassMapper:在类 com.x.y.models.PickupCode 上找不到 isDelivered 的设置器/字段
玩了一会儿之后,我发现由于某种奇怪的原因,以is
开头的属性的设置器被忽略了:S 我也测试了其他属性名称和类型.. fx。 val isBerp: Number
得到同样的警告。
因此,在类和 firebase 中将属性名称从 isDelivered
更改为 delivered
后,它就可以工作了..
我无法找到有关此行为的文档,因此如果有人知道它,将不胜感激链接..
【讨论】:
Firestore 从 getter 中移除is
前缀。见此链接:e-learn.cn/en/node/1313471
面对同样的问题,你至少节省了我 2 小时以上是关于从 Firebase 数据库快照解析布尔值的主要内容,如果未能解决你的问题,请参考以下文章
如何解析 Firebase FDataSnapshot 对象?
使用 swiftyJSON/swift 从 Firebase 解析排行榜数据