2017-07-24 70 views
0

我有用户与列表获取对象从火力上的Android

public class User { 

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

A类和我在我的火力有这个数据DB

enter image description here

之前,我添加了“袋”项目,该对象创建正常,我使用这种方法来检索用户的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); 

我搜索了很多关于如何检索列表,但我觉得是检索一个列表对象,而不是一个“混合“带有”单个数据“的对象和一个列表。

+0

我想手动反序列化是在这种情况下,更好的方法。但是你可能会尝试使用'HashMap '这个袋子属性。 –

回答

0

试试这个:

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

正如你错误所述,虽然反序列化它预计HashMap而不是List。由于Firebase是NoSQL数据库,因此Firbease中的所有内容都是按键和值组成的。因此,Firebase中的每个节点都是Map。为了解决这个问题,请将bags从列表更改为HashMap,您的问题将得到解决。

你也可以试试这个:

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

我试过了,但现在错误是这样的:'类java.util.HashMap具有泛型类型参数,请使用GenericTypeIndicator来代替' – Doruko

+0

请看我更新的答案。 –