从Firebase数据库中检索用户

时间:2018-02-08 20:25:44

标签: android firebase firebase-realtime-database

我是一个简单的数据库,我保存应用程序的用户,如下所示:

firebase_database

我想检索所有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个用户。有什么想法吗?

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.