从 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 deliveredtrue,但由于某种原因,快照中isDeliveredtrue-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 对象?

如何从 Firebase 检索图像作为布尔数据?

使用 swiftyJSON/swift 从 Firebase 解析排行榜数据

Firebase 快照返回 null

如何将firebase快照值从一个函数提取到另一个函数变量?

Firebase JavaScript 快照获取值