Firebase limitToLast(查询)不解析响应

时间:2016-07-27 21:24:21

标签: android firebase firebase-realtime-database

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

moodListList<Mood>

1 个答案:

答案 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>}}