Анализ логического значения из снимка базы данных Firebase - PullRequest
0 голосов
/ 19 июня 2019

У меня проблемы со вставкой снимка из базы данных Firebase Realtime в класс данных в Kotlin с использованием ProGuard.

Вот как выглядят данные в консоли 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 {key = 320625, значение = {isDelivered = true, код = 320625, ящики = {0 = 2}, orderId = -LhdzXS4-gyT0ysNe-zi, suborderId = -LhdzYhT78y9b3iJcyrb, boxId} * 10_1

И это то, что следующий отпечаток на 3 строки позже печатает:

Код: 320625, поставляется: ложно для ящиков: [2]

Здесь я ожидал бы, что is delivered будет true, но по какой-то причине true -значение isDelivered из снимка игнорируется при анализе снимка в PickupCode -классе. Значение isDelivered для PickupCode равно пустому конструктору класса.

Но ПОЧЕМУ и КАК это исправить?

Все остальные значения из моментального снимка анализируются корректно. Я новичок в Android, но у меня есть догадка, что в ProGuard (что бы это ни было) есть какая-то вина ... Вот как я это настроил:

-keepattributes Signature

-keepclassmembers class PickupCode.** {
    *;
}

1 Ответ

0 голосов
/ 19 июня 2019

Я нашел решение для этого .. При проверке подробных журналов я нашел это:

W / ClassMapper: не найден сеттер / поле для isDelivered в классе com.xymodels.PickupCode

Поэкспериментировав, я обнаружил, что по какой-то странной причине сеттеры для свойств, начинающихся с is, игнорируются: SI проверял и другие имена свойств и типы .. fx.val isBerp: Number получает то же предупреждение.

Так что после изменения имени свойства с isDelivered на delivered в классе и в базе данных, оно работает ..

Я не смогчтобы найти документацию по этому поведению, так что если кто-то знает об этом, он будет признателен за ссылку ..

...