我正在查询以从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


moodListList<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>}}

08-05 21:01