代码之家  ›  专栏  ›  技术社区  ›  Chinaedu Onwukwe

从Firebase检索数据返回null

  •  0
  • Chinaedu Onwukwe  · 技术社区  · 8 年前

    我在Firebase的数据库中存储了一个用户。当我想检索用户时,它是空的,我无法解释原因。我的用户类只是由一个 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 回复  |  直到 8 年前
        1
  •  1
  •   Salman500    8 年前

    用户[0]将始终为空,因为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) {
    
            }
        });
    }
    
        2
  •  0
  •   Nirel    8 年前

    Firebase数据库是异步的,

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

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

        3
  •  0
  •   Frank van Puffelen    8 年前

    当您从firebase获取数据时,它是一个 异步任务 . 如果调用getUser()并返回user[0],那么它将始终返回null,因为在获取结果之前( DataSnapshot )从firebase返回函数。

    这是密码,

    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数据库侦听器代码放在一个地方,以分离数据库层和逻辑层。