【问题标题】:Get object with list from firebase on Android从 Android 上的 firebase 获取带有列表的对象
【发布时间】:2017-07-24 13:37:31
【问题描述】:

我有一个用户类

public class User {

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

我的 firebase 数据库中有这些数据

在我添加“包”项之前,该对象已创建良好,我正在使用此方法通过 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);

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

【问题讨论】:

  • 我认为在这种情况下手动反序列化是更好的方法。但是你可以尝试使用 HashMap&lt;String, Bag&gt; 类型作为 bag 属性。

标签: android firebase firebase-realtime-database


【解决方案1】:

正如你所说的,在反序列化时,它应该是 HashMap 而不是 List。因为 Firebase 是一个 NoSQL 数据库,所以 Firbease 中的所有内容都是由键和值对构成的。所以 Firebase 中的每个节点都是一个Map。为了解决这个问题,把bags从List改成HashMap,你的问题就解决了。

你也可以试试这个:

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

【讨论】:

  • 我试过了,但现在错误是这样的:Class java.util.HashMap has generic type parameters, please use GenericTypeIndicator instead
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-29
    • 2019-07-09
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多