android - Firebase 实时数据库根据查询的值返回 ArrayList 或 HashMap

标签 android firebase kotlin firebase-realtime-database

我有一个具有以下结构的 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: Expected a List while deserializing, but got a class java.util.HashMap

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

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

这显然修复了这些类别,但我在以前工作过的类别中遇到了一个异常(exception):

com.google.firebase.database.DatabaseException: Expected a Map while deserializing, but got a class java.util.ArrayList

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

最佳答案

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

In particular, if all of the keys are integers, and more than half of the keys between 0 and the maximum key in the object have non-empty values, then Firebase will render it as an array.

当您没有条件时,您的数据会与这些条件匹配,并且结果会以列表的形式显示。但是,当您对查询有条件时,可能不满足条件,结果会变成 Map

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

  • 要么调用不带类型的 getValue(),然后执行动态类型检查以查看返回的内容。
  • 或者使用从未转换为列表的键,通过在数值前加上固定字符串作为前缀。例如。 key0key1

关于android - Firebase 实时数据库根据查询的值返回 ArrayList 或 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66736741/

相关文章:

firebase - Firestore 规则 : condition check fails when data is number

Android 和 Kotlin 协程 : Is it possible to run out of threads?

regex - 为什么前瞻和后瞻正则表达式在 Kotlin 中不起作用?

android - 将一个 fragment 滑过另一个 fragment

android - 如何使用 Parse Facebook for Android 获取用户电子邮件地址-

android - 推送通知不适用于 FCM

android - 用户 ID 的 Firebase 远程配置条件

regex - Kotlin 正则表达式边界匹配不工作

Android:无法通过功能循环中途打开数据库文件

java - 在Java中调用具有相同名称的方法内的另一个方法