【问题标题】:Firebase Database Exception while retrieving data from Firebase database从 Firebase 数据库中检索数据时出现 Firebase 数据库异常
【发布时间】:2017-06-30 10:18:48
【问题描述】:

我有一个 Firebase 数据库,如下所示。我正在尝试检索此剧集数据,但总是出错

users:
{
 Fcm_id: "c68y2j3bwis:APA91bFABxC6W5FmYVCOSmgJiB_-UEqnrmQ...",
 Name: "Vikas Kumar",
 episodes:{
 0: "-Kno0IYdlSjjfFsXkGQ7",
 1: "-Kno0IYdlSjjfFsXkGQ8"
 },
 gender:Male,
 age:14,
 email:"vikas@gmail.com",
}

这是我在其中创建 HashMap 的用户 POJO 类

public class User implements Serializable{

    private String Name;
    private String email;
    private String gender;
    private String Fcm_id;
    private String id;
    private int age;
    private String image;

    private ArrayList<Map<String,Object>> episodes;



public User()
{

}

public ArrayList<Map<String, Object>> getEpisodes() {
    return episodes;
}

public void setEpisodes(ArrayList<Map<String, Object>> episodes) {
    this.episodes = episodes;
}


    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getFcm_id() {
        return Fcm_id;
    }

    public void setFcm_id(String Fcm_id) {
        this.Fcm_id = Fcm_id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

}

ListPatients.java 类 我已经编写了代码来从数据库中检索数据

 firebasePathMain.child("users").child(auth.getCurrentUser().getUid()).child("episodes").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                String episodeId = dataSnapshot.getValue().toString();
                Log.d(TAG,episodeId);

                firebasePathMain.child("episodes").child(episodeId).child("Participants").child("User_id").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        final String UserId = dataSnapshot.getValue().toString();
                        Log.d(TAG,UserId);

                        firebasePathMain.child("users").child(UserId).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                User user = dataSnapshot.getValue(User.class);
                                user.setId(UserId);

                                Log.d(TAG,user.getName());
                                listPatient.add(user);
                                adapterPatients.notifyDataSetChanged();

                               // adapterPatients.refillAdapter(user);
                              //  listUpdate.add(0, user.getId());

                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                        Listpatients.add(UserId);
                        Log.d(TAG,Listpatients.toString());

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

但是当我试图检索数据时,这是这个错误

反序列化时需要一个 Map,但得到了一个类 java.util.ArrayList

【问题讨论】:

标签: android firebase firebase-realtime-database firebase-authentication


【解决方案1】:

您需要使用Map&lt;String, Object&gt;,而不是HashMap&lt;Integer, String&gt;

请使用此代码:

private Map<String, Object> episodes;

public HashMap<String, Object> getEpisodes() {
    return episodes;
}

public void setEpisodes(HashMap<String, Object> episodes) {
    this.episodes = episodes;

}

要查询您的数据库,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference episodesRef = rootRef..child("users").child(auth.getCurrentUser().getUid()).child("episodes");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String key = ds.getKey();
            String value = ds.getValue(String.class)
            Log.d("TAG", "key= " + key + " -> value: " + value);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
episodesRef.addListenerForSingleValueEvent(eventListener);

输出将是:

 key: 0 -> value: -Kno0IYdlSjjfFsXkGQ7
 key: 1 -> value: -Kno0IYdlSjjfFsXkGQ8

它肯定会起作用。

【讨论】:

  • 在反序列化时需要一个 Map,但得到了一个类 java.util.ArrayList
  • 你需要将implements Serializable添加到你的POJO类中,你的问题就会得到解决。
  • 好吧,你需要用Map更改声明为ArrayList的其他字段。请记住,Firebase 数据库中的每个条目都是由键值对构成的。
  • 不完整。与所有字段共享完整版本
  • 为了让 Firebase 正常工作,您需要在 pojo 中添加无参数构造函数 -> User() {}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多