与列表获取对象从火力上的Android
public class User {
@SerializedName("username")
private String userName;
@SerializedName("email")
private String email;
@SerializedName("bags")
private List<Bag> bags;
.
.
.
A类和我在我的火力有这个数据DB
之前,我添加了“袋”项目,该对象创建正常,我使用这种方法来检索用户的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);
我搜索了很多关于如何检索列表,但我觉得是检索一个列表对象,而不是一个“混合“带有”单个数据“的对象和一个列表。
试试这个:
@SerializedName("bags")
private Map<String,Bag> bags;
正如你错误所述,虽然反序列化它预计HashMap
而不是List
。由于Firebase是NoSQL数据库,因此Firbease中的所有内容都是按键和值组成的。因此,Firebase中的每个节点都是Map
。为了解决这个问题,请将bags
从列表更改为HashMap
,您的问题将得到解决。
你也可以试试这个:
GenericTypeIndicator<List<YourClass>> t = new GenericTypeIndicator<List<Message>>() {};
List<YourClass> messages = snapshot.getValue(t);
我试过了,但现在错误是这样的:'类java.util.HashMap具有泛型类型参数,请使用GenericTypeIndicator来代替' – Doruko
请看我更新的答案。 –
我想手动反序列化是在这种情况下,更好的方法。但是你可能会尝试使用'HashMap'这个袋子属性。 –