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