我正在查询以从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,它只是我的Object属性的String形式的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>
最佳答案
您没有发布Mood
类的代码或存储在“心情”位置的JSON示例代码。我假设您已将Mood
定义为满足Firegets / setter和默认构造函数对Firebase要求的POJO。同样,存储在“ mood”上的值是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>}}