我已将用户存储在Firebase的数据库中。当我想检索用户时,它为null,我无法解释自己的原因。我的User类仅包含String
'电子邮件'和String
'名称'和boolean
'firstAppUse'。
因此,我编写了以下方法来从数据库中检索用户:
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());
} 有人看到这个问题吗?预先感谢。
答案 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数据库侦听器代码放在一个位置,以分离数据库层和逻辑层。