我的应用程序中有用户,我在Firebase数据库中存储了有关它们的其他信息。我需要在多个Activity中检索其他信息。我不想使用ValueEventListeners,因为除非数据库中有任何更改,否则不会调用它们。如何在不使用ValueEventListeners的情况下从数据库获取有关用户的信息?
在我的ProfileFragment中,我需要获取名称和离开值。
我从Firebase获得当前用户,并尝试使用其他信息。
talker = new DatabaseTalk();
FirebaseUser currentUser = mAuth.getCurrentUser();
// Get info of logged in user with talker.
loggedInUser = talker.getUserFromID(currentUser.getUid());
这是我的DatabaseTalker类,用于处理对数据库的读写操作
public class DatabaseTalk {
private FirebaseDatabase mDatabase;
private DatabaseReference UserRef;
private DatabaseReference SurveyRef;
private List<User> userList;
public DatabaseTalk(){
mDatabase = FirebaseDatabase.getInstance();
UserRef = mDatabase.getReference("users");
UserRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot child: dataSnapshot.getChildren()){
userList.add(child.getValue(User.class));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("Error", "Failed to read value.", databaseError.toException());
}
});
SurveyRef = mDatabase.getReference("surveys");
}
public void WriteUser(User usr){
UserRef.child(usr.getUserID()).setValue(usr);
}
public void WriteSurvey(Survey survey){SurveyRef.push().setValue(survey);}
public User getUserFromID(String id){
for(User usr: userList){
if(usr.getUserID().equals(id))
return usr;
}
return null;
}
}
我认为,我可以从DatabaseTalk中的userList获取有关用户的其他信息,但userList始终为null。
修改 我更改了getUserFromID方法。当我调用getUserFromID方法时,OnDataChange()不起作用。
public User getUserFromID(String id){
DatabaseReference newRef = mDatabase.getReference("users");
DatabaseReference ds = newRef.child(id);
ds.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
userList.add(dataSnapshot.getValue(User.class));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return userList.get(0);
}
答案 0 :(得分:1)
我解决了这个问题。原来我不知道Firebase实际上是如何工作的。由于onDataChange()进行异步调用,因此在函数上编写监听器定义是无用的,因为onDataChange在函数终止之前通常不会触发,这会导致函数返回null值。 我在onCreate方法中定义了ValueEventListeners。它在我的ProfileFragment创建几秒后就会触发。我认为最好使用Progress Dialogs等待。
感谢所有对此问题感兴趣的人。