android - Firebase limitToLast(查询)不解析响应

标签 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,但两者都有 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,它只是我的对象属性作为字符串的映射,但未被解析。

为什么 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作为满足 Firebase 对 getter/setter 和默认构造函数的要求的 POJO。此外,存储在“mood”中的值是 Mood 的有效数组。元素。

当您使用 limitToLast(1) 修改查询时, Firebase 返回包含最后一个 Mood 的 map 在数组中。也许您期望它返回 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>}}

关于android - Firebase limitToLast(查询)不解析响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38623438/

相关文章:

Androidx 谷歌源 : get specific version?

android - 如何从应用程序内启动 Android 模式锁屏

firebase - Firebase 托管的 Flutter Web/Dart CORS 错误

android - Firebase 区间组合查询

swift - 火力地堡 + swift : Grab only the latest change for a child node

android - 长按按钮上的上下文菜单?

java - 从当前位置向后循环遍历数组

python - 实时散点图每 2 秒从 Firebase 获取数据

java - Firebase:没有要序列化的属性 - Android

firebase - 在 Firebase 中注册时保存其他字段