Datasnapshot的getValue()方法为空

时间:2018-05-17 09:09:34

标签: android firebase firebase-realtime-database

我一直在努力解决这个问题大约三天。或者我可能不理解addValueEventListener()的概念。我有一个POJO课程。

public class InstantMessage {

    private String UID;
    private String email;
    private String password;
    private String type;

    public InstantMessage() {
    }

    public InstantMessage(String newUID, String newEmail, String newPassword, String newType) {
        UID = newUID;
        email = newEmail;
        password = newPassword;
        type = newType;
    }

    public void setUID(String newUID) {
        UID = UID;
    }

    public void setEmail(String newEmail) {
        email = newEmail;
    }

    public void setPassword(String newPassword) {
        password = newPassword;
    }

    public void setType(String newType) {
        type = newType;
    }

    public String getUID() {
        return UID;
    }

    public String getEmail()
    {
        return email;
    }

    public String getPassword()
    {
        return password;
    }

    public String getType()
    {
        return type;
    }
}

我实际想要实现的是获取"输入" Firebase数据库中的节点。我的数据库参考是:

mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users");

我试图遍历Datasnapshot对象仍然没有运气。

这就是我要做的事情。

private void showData(){

        mDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                InstantMessage iM1 = dataSnapshot.getValue(InstantMessage.class);
                //System.out.println("The type is:" + iM1.getType());
                sampleUser.add(iM1);
                studentAdapter.notifyDataSetChanged();

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }

正如您在日志中看到的那样,Datasnapshot正在获取我正在寻找的对象,但值为null。

enter image description here

enter image description here

如果这只是一个新手问题,我很抱歉,但我正努力学习它。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您正在获取所有用户的列表(来自/Users),然后尝试将整个结果映射到单个InstantMessage。这不会起作用,因为InstantMessage中的属性并不直接存在于/Users中,它们在您的JSON中更深一层。

要解决此问题,您需要遍历快照的子节点以获取各个消息:

mDatabaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
            InstantMessage iM1 = messageSnapshot.getValue(InstantMessage.class);
            sampleUser.add(iM1);
        }
        studentAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});