【问题标题】:Firebase Realtime Database returns ArrayList or HashMap depending on the value queriedFirebase 实时数据库根据查询的值返回 ArrayList 或 HashMap
【发布时间】:2021-03-21 19:39:04
【问题描述】:

我有一个 Fierbase 实时数据库,其结构如下:

data
    0
       category : "Some category"
    1
       category : "Some category"
    2
       category : "Another category"

这是一个包含不同类别项目的长列表(他们有更多字段,我认为购买它们与此无关)。 我正在查询给定类别的所有项目:

firebaseDatabase.child("data")
            .orderByChild("category")
            .equalTo(category.name)

我正在通过以下方式处理快照:

snapshot.getValue<List<FirebaseEntry>>()!!.filterNotNull().map { it.toEntry() }

这段代码似乎运行良好(我可以获取某些类别的所有条目),虽然我测试了不同的类别,但我只得到了其中一些类别的异常:

com.google.firebase.database.DatabaseException:反序列化时需要一个列表,但得到一个类 java.util.HashMap

我不明白为什么它对某些类别有效而对其他类别无效,因为所有类别的数据结构都是相同的。然后我尝试将其解析为 HashMap:

snapshot.getValue<HashMap<String, FirebaseEntry>>()!!.map { it.value.toEntry() }.sortedBy { it.id }

这显然修复了这些类别,但我在以前工作的那些类别中遇到了一个例外:

com.google.firebase.database.DatabaseException:反序列化时需要一个 Map,但得到一个类 java.util.ArrayList

当数据库中的数据相似时,是否有理由导致结果以不同的格式出现? 完整列表大约有 300 项,它们按类别顺序排列(首先是一个类别的所有项目,然后是另一个类别,依此类推),我认为这不是原因,但我现在迷路了,我不能看看有什么问题。

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database


    【解决方案1】:

    如果满足特定条件,Firebase SDK 会将服务器返回的数据强制转换为数组/List。正如加藤在Best Practices: Arrays in Firebase 中所说:

    特别是,如果所有键都是整数,并且对象中 0 到最大键之间的键中有一半以上具有非空值,则 Firebase 会将其呈现为数组。

    当您没有条件时,您的数据与这些条件匹配,结果显示为List。但是当你对查询有条件时,可能不满足条件,结果变成Map

    对于此转换,您无能为力,因此您的选择仅限于:

    • 在没有类型的情况下调用 getValue(),然后执行动态类型检查以查看返回的内容。
    • 或使用从未转换为List 的键,方法是在数值前加上一个固定字符串。例如。 key0key1

    【讨论】:

    • 这解决了我的问题,让我更好地了解如何使用实时数据库。我会尝试第二种解决方案。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多