我有一个具有以下结构的 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()
,然后执行动态类型检查以查看返回的内容。 - 或者使用从未转换为
列表
的键,通过在数值前加上固定字符串作为前缀。例如。key0
、key1
等
关于android - Firebase 实时数据库根据查询的值返回 ArrayList 或 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66736741/