如何检索firebase数据库条目的细节?

时间:2017-06-05 10:22:51

标签: android firebase firebase-realtime-database

我一直在尝试从存储在firebase实时数据库中的数据中检索数据字段,而且我被卡住了。

这就是我的数据库的样子: firebase realtime database

这是我在AuthStateListener对象中调用的方法,定义如下:

private void alterTextView(final String id) {
    if(id!=null) {
        mDatabase.child("Users").child(id).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    if (ds.exists()) {
                        UserInformation userInformation = ds.child(id).getValue(UserInformation.class);
                        String name = userInformation.getName();
                        mWelcomeUserMessage.setText(name);
                        //logging name
                        Log.d("My activity", "name of user with userID - " + id + " is : " + userInformation.getName());
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
}

对此功能的调用如下:

 mAuthStatelistener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            //if user is logged in, the sign_in and sign_up buttons should not be displayed
            if (firebaseAuth.getCurrentUser() != null) {
                userId = firebaseAuth.getCurrentUser().getUid();
                Log.d("Main Activity", "Current userId : " + userId);
                alterTextView(userId);
                mLogInButton.setVisibility(View.INVISIBLE);
                mSignUpButton.setVisibility(View.INVISIBLE);
                //getUserName(firebaseAuth.getCurrentUser().getUid());
                mLogOutButton.setVisibility(View.VISIBLE);
            } else {
                mLogInButton.setVisibility(View.VISIBLE);
                mSignUpButton.setVisibility(View.VISIBLE);
                mWelcomeUserMessage.setVisibility(View.GONE);
                mLogOutButton.setVisibility(View.GONE);
            }
        }
    };

出于某种原因,我在第一个代码摘录中不断获取空指针异常,我在userInformation对象中存储了该名称 -

String name = userInformation.getName();

我无法理解为什么会这样。

我的主要目标是在他/她登录后打印出登录用户的姓名。

有没有人知道这样做的方法?

更新1 这就是我的UserInformation类:

public class UserInformation {

private String name;
private String student_number;
private String faculty;
private boolean isAdmin;

public String getName() {
    return name;
}

public String getStudent_number() {
    return student_number;
}

public String getFaculty() {
    return faculty;
}

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

public boolean isAdmin() {
    return isAdmin;
}

public void setAdmin(boolean admin) {
    isAdmin = admin;
}

public void setStudent_number(String student_number) {
    this.student_number = student_number;
}

public void setFaculty(String faculty) {
    this.faculty = faculty;
}
}

2 个答案:

答案 0 :(得分:3)

不需要onDataChange()方法中的循环:

public void onDataChange(DataSnapshot dataSnapshot) {
    if (ds.exists()) {
        UserInformation userInformation = ds.child(id).getValue(UserInformation.class);
        String name = userInformation.getName();
        mWelcomeUserMessage.setText(name);
        //logging name
        Log.d("My activity", "name of user with userID - " + id + " is : " + userInformation.getName());
    }
}

只有在使用带有值侦听器的查询时才需要循环,因为查询可以有多个结果。但在您的情况下,您可以直接访问正确的子节点,因此不需要循环。

答案 1 :(得分:2)

您正在尝试访问不存在的子项,这就是您获得空值的原因。您的听众已经收听" id child",请替换以下行:

 UserInformation userInformation = ds.child(id).getValue(UserInformation.class);

人:

 UserInformation userInformation = ds.getValue(UserInformation.class);

然后,返回 UserInformation.class ,添加以下更改:

@IgnoreExtraProperties // Add this tag
public class UserInformation {

    private String name;
    private String student_number;
    private String faculty;
    private boolean isAdmin;

    //Define this constructor
    public UserInformation() {
        // Default constructor required for calls to DataSnapshot.getValue(UserInformation.class)
    }
    // The rest of your class ...

}