从Firebase检索数据将返回null

时间:2018-06-29 07:35:09

标签: android firebase firebase-realtime-database

我已将用户存储在Firebase的数据库中。当我想检索用户时,它为null,我无法解释自己的原因。我的User类仅包含String'电子邮件'和String'名称'和boolean'firstAppUse'。

enter image description here

因此,我编写了以下方法来从数据库中检索用户:

public static User getUser(){
    final User [] user = new User[1];
    DatabaseHelper.userDB.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            user[0] = dataSnapshot.getValue(User.class);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    return user[0];
}

缩小所有期望user[0]为空。尽管该元素存在于数据库中,并且在DatabaseHelper.userDB中对其的引用也很好:

public class DatabaseHelper {
private static FirebaseDatabase database = FirebaseDatabase.getInstance();
public static DatabaseReference userDB = database.getReference("users/" + FirebaseAuth.getInstance().getCurrentUser().getUid());

} 有人看到这个问题吗?预先感谢。

3 个答案:

答案 0 :(得分:1)

user [0]始终为null,因为Firebase数据库是异步的

// in userdb it should be like this
// database.child("users").child("uid")
private User mUser = null;
public void getUser(){

    DatabaseHelper.userDB.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
              if dataSnapshot.exists(){
                 mUser = dataSnapshot.getValue(User.class);
           // do something with user
                      }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

答案 1 :(得分:0)

Firebase数据库是异步的

当代码进入“ return”行时,“ onDataChange”回调中的代码块未执行

Please, read that article to learn more about async and sync methods

答案 2 :(得分:0)

从Firebase提取数据时,它是异步任务。如果调用getUser()并返回user [0],则它将始终返回null,因为在从firebase获取结果(DataSnapshot)之前,您已经返回了该函数。

这是代码,

public static void getUser(Handler.Callback callback){
    DatabaseHelper.userDB.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            User userObj = dataSnapshot.getValue(User.class);;

            Message message = new Message();
            Bundle bundle = new Bundle();
            bundle.putSerializable("user",userObj); //Make sure that user object is serialisable
            message.setData(bundle);
            callback(message);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Message message = new Message();
            Bundle bundle = new Bundle();
            bundle.putSerializable("user",null);
            message.setData(bundle);
            callback(message);
        }
    });

}

这是您应该如何调用此函数的地方:

getUser(new Handler.Callback(){
        @Override
        public boolean handleMessage(Message message) {
            if(message != null){
               User user = (User)message.getData().get("user");
               //Do whatever you want with "user" object
            }
            return false;
        }
    });

这将使您的代码模块化。您可以在代码中的任何位置调用此函数以获取用户对象,并且可以将所有Firebase数据库侦听器代码放在一个位置,以分离数据库层和逻辑层。