从Firebase数据库快照解析布尔值

时间:2019-06-19 09:27:01

标签: android firebase firebase-realtime-database kotlin proguard

我遇到了使用ProGuard将快照从Firebase实时数据库粘贴到Kotlin中的数据类的问题。

以下是数据在Firebase控制台中的显示方式:

Firebase realtime database, screenshot of data

这是我在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 {键= 320625,值= {isDelivered = true,代码= 320625,抽屉= {0 = 2},orderId = -LhdzXS4-gyT0ysNe-zi,suborderId = -LhdzYhT78y9b3iJcyrb,boxId = box_1}}

这是下一行打印3行的最新内容:

  

代码:320625,已交付:对抽屉为假:[2]

在这里,我希望is deliveredtrue,但是出于某种原因,将快照中的true的{​​{1}}值解析为{ {1}}级。 isDelivered的值PickupCode等于该类的空构造函数。

但是为什么以及如何解决?

快照中的所有其他值都会得到正确解析。我是Android的新手,但我有种直觉,认为ProGuard(无论是哪种方式)都应归咎于此。.这是我的设置方法:

isDelivered

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。 查看详细日志时,我发现了这一点:

  

W / ClassMapper:在com.x.y.models.PickupCode类上找不到isDelivered的设置程序/字段

玩了一会儿之后,我发现出于某些奇怪的原因,以is开头的属性的设置方法被忽略了:S我也测试了其他属性名称和类型。 val isBerp: Number得到同样的警告。

因此,在类和firebase中将属性名称从isDelivered更改为delivered之后,它就可以工作。.

我无法找到有关此行为的文档,因此,如果有人知道这一点,将不胜感激链接。