我正在进行查询以从Firebase获取数组,一切正常。查询如下:
FirebaseDatabase.getInstance().getReference()
.child("results").child("mood")
.child(Preferences.getUserId(this))
.addListenerForSingleValueEvent(new ValueEventListener() {
...
我注意到child()链总是返回一个DatabaseReference对象。但是,我想使用limitToLast()来获取此数组的最后一个元素。我真的不明白为什么但是它返回Query而不是DatabaseReference,但是由于DbRef扩展了Query,所以它们都有addListenerForSingleValueEvent()方法。
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,它只是一个我的对象属性的Map作为字符串但未解析。
为什么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>
答案 0 :(得分:1)
您没有发布Mood
课程的代码或存储在位置&#34;心情&#34;的JSON样本。我假设您已将Mood
定义为满足Firebase / setter和默认构造函数的Firebase要求的POJO。此外,该值存储在&#34;心情&#34;是一个有效的Mood
元素数组。
使用limitToLast(1)
修改查询时,Firebase会返回包含数组中最后Mood
的地图。也许你期望它返回长度为1的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>}}