从Android上的firebase获取列表对象

时间:2017-07-24 13:37:31

标签: android firebase firebase-realtime-database

我有一个用户类

public class User {

@SerializedName("username")
private String userName;
@SerializedName("email")
private String email;
@SerializedName("bags")
private List<Bag> bags;
.
.
.

我在firebase DB中有这些数据

enter image description here

在我添加“bags”项目之前,对象创建正常,我正在使用此方法通过uid检索用户:

public void retrieveUserByUid(String uid, FirebaseRetrieveUserListener listener){
    Query userQuery = dbReference.child(FirebaseChild.users.name()).child(uid);

    final FirebaseRetrieveUserListener dataListener = listener;

    userQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            dataListener.retrieveUserByUid(user);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

正如我所说,这个没有“袋子”项目,当我说它,我得到的错误就是这个。

com.google.firebase.database.DatabaseException: Expected a List while deserializing, but got a class java.util.HashMap

当我尝试这样做时会发生这种情况

 User user = dataSnapshot.getValue(User.class);

我搜索了很多关于如何检索列表的信息,但我发现只检索单个列表对象,而不是“单一数据”和列表的“混合”对象。

2 个答案:

答案 0 :(得分:1)

正如您所说的那样,反序列化时预计会HashMap而不是List。由于Firebase是NoSQL数据库,因此Firbease中的所有内容都构成为键和值对。因此,Firebase中的每个节点都是Map。要解决此问题,请将bags从列表更改为HashMap,您的问题就会得到解决。

你也可以试试这个:

GenericTypeIndicator<List<YourClass>> t = new GenericTypeIndicator<List<Message>>() {};
List<YourClass> messages = snapshot.getValue(t);

答案 1 :(得分:0)

试试这个:

@SerializedName("bags")
private Map<String,Bag> bags;