我一直在尝试从存储在firebase实时数据库中的数据中检索数据字段,而且我被卡住了。
这是我在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;
}
}
答案 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 ...
}