我是一个简单的数据库,我保存应用程序的用户,如下所示:
我想检索所有users_data。
我有以下用户模型:
public class User {
private String name;
private String email;
private String uid;
private String pass;
public User() {
}
public User(String uid, String name, String email, String pass) {
this.name = name;
this.email = email;
this.uid = uid;
this.pass = pass;
}
//GETTERS & SETTERS//
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", uid='" + uid + '\'' +
", pass='" + pass + '\'' +
'}';
}
}
问题是我似乎无法检索数据,我使用以下方法:
public ArrayList<User> listUsers() {
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference().child("users" + "/" + "users_data");
final ArrayList<User> userArrayList = new ArrayList<>();
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User post = dataSnapshot.getValue(User.class);
userArrayList.add(post);
System.out.println(post);
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
return userArrayList;
}
但是这会返回一个包含0个元素的数组。我究竟做错了什么?如果我将DatabaseReference更改为其中一个子节点,则该方法返回1个用户。有什么想法吗?
答案 0 :(得分:1)
addValueEventListener设置异步调用。保证onDataChange在你的return语句到达很久之后才被调用,使它返回一个空的arraylist。在你进行异步调用之后,你根本无法使用返回类型。
为了使您的设计正常工作,您需要将userArrayList输入到onDataChange中调用的另一个方法中。这样一来,你的方法就会在你的arraylist被填充之后完成。
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User post = dataSnapshot.getValue(User.class);
userArrayList.add(post);
//Add
Object.methodThatDoesSomething(userArrayList);
//or
Class.staticMethodThatDoesSomething(userArrayList);
System.out.println(post);
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
// Then don't do anything with userArrayList after this point because
// it won't be populated yet.