【问题标题】:Firebase limitToLast (Query) not parsing the responseFirebase limitToLast(查询)不解析响应
【发布时间】:2016-12-02 01:59:02
【问题描述】:

我正在查询从 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,它只是我的 Object 属性作为字符串但未解析的 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&lt;Mood&gt;

【问题讨论】:

  • 您共享的任何代码都不会对 DataSnapshot 执行任何会触发此错误的操作。请包含实际导致问题的代码。
  • 从给定的有限信息 dataSnapshot.getValue(List);是问题所在。您正在从服务器获取哈希图,但您希望它期待一个列表。
  • 刚刚添加了相关代码。我没有包括它,因为我没有为这两种情况更改它。
  • @FrankvanPuffelen:请查看我的回答,看看您能否提供更多见解。

标签: android firebase firebase-realtime-database


【解决方案1】:

您没有发布 Mood 类的代码或存储在“mood”位置的 JSON 样本。我假设您已将 Mood 定义为满足 Firebase 对 getter/setter 和默认构造函数的要求的 POJO。此外,存储在“mood”中的值是Mood 元素的有效数组。

当您使用 limitToLast(1) 修改查询时,Firebase 会返回一个包含数组中最后一个 Mood 的映射。也许您期望它返回一个长度为 1 的 List&lt;Mood&gt;。我没有发现 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>}}

【讨论】:

  • 感谢您回答qbix。是的,你的第一段。是的,limitToLast() 需要一个 Integer,所以无论如何它都应该返回一个 List,但是文档确实不是很清楚。我已经测试了您的代码并且得到了预期的输出,但是这个 HashMap 没有被转换为我的 Mood 对象。我不想因为 Firebase 应该已经做的事情而惹恼 Gson/Jackson。看起来由于某种原因 Query 没有反序列化对象,只有 DatabaseReference。我希望@FrankvanPuffelen 仍然可以帮助我。
  • @FrankvanPuffelen 我仍然没有解决这个旧线程的问题:(
猜你喜欢
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
相关资源
最近更新 更多