我正在查询以从 Firebase 获取数组,一切正常。查询如下:
FirebaseDatabase.getInstance().getReference()
.child("results").child("mood")
.child(Preferences.getUserId(this))
.addListenerForSingleValueEvent(new ValueEventListener() {
...
我注意到 child() 链总是返回 DatabaseReference目的。但是,我想使用 limitToLast()仅获取此数组的最后一个元素。我真的不明白为什么但它返回 Query而不是 DatabaseReference,但两者都有 addListenerForSingleValueEvent() 方法,因为 DbRef 扩展了 Query。
FirebaseDatabase.getInstance().getReference()
.child("results").child("mood")
.child(Preferences.getUserId(this))
.limitToLast(1)
.addListenerForSingleValueEvent(new ValueEventListener() {
问题是它没有像使用 DbRef 那样解析我的响应,然后我得到一个异常:
com.google.firebase.database.DatabaseException: Expected a List while deserializing, but got a class java.util.HashMap
我查看了 HashMap,它只是我的对象属性作为字符串的映射,但未被解析。
为什么 Query 和 DatabaseReference 有不同的响应/反序列化方法?
非常感谢任何帮助。
编辑: 根据要求,它是获取数据的代码。两种情况都一样。
@Override
public void onDataChange(DataSnapshot snapshot) {
GenericTypeIndicator<List<Mood>> t = new GenericTypeIndicator<List<Mood>>() {};
moodList = snapshot.getValue(t);
...do stuff with moodList
而 moodList
是 List<Mood>
最佳答案
您没有发布 Mood
的代码类或存储在“心情”位置的 JSON 示例。我假设您已经定义了 Mood
作为满足 Firebase 对 getter/setter 和默认构造函数的要求的 POJO。此外,存储在“mood”中的值是 Mood
的有效数组。元素。
当您使用 limitToLast(1)
修改查询时, Firebase 返回包含最后一个 Mood
的 map 在数组中。也许您期望它返回 List<Mood>
长度为一。我没有找到关于这一点的 Firebase 文档。也许 Firebaser Frank 可以提供更多细节。
为了更清楚地查看 limitToLast(1)
返回的内容,您可以像这样修改您的代码:
public void onDataChange(DataSnapshot snapshot) {
Map<String,Object> map = (Map<String,Object>) snapshot.getValue();
Log.i(TAG, "onDataChange: map=" + map);
}
输出将如下所示,其中 N 是数组中最后一个值的索引:
onDataChange: map={N={<the fields of your Mood POJO here>}}
关于android - Firebase limitToLast(查询)不解析响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38623438/