Firebase数据库Android - 在没有ValueEventListeners的情况下检索信息

时间:2018-01-24 17:43:48

标签: android firebase firebase-realtime-database

我的应用程序中有用户,我在Firebase数据库中存储了有关它们的其他信息。我需要在多个Activity中检索其他信息。我不想使用ValueEventListeners,因为除非数据库中有任何更改,否则不会调用它们。如何在不使用ValueEventListeners的情况下从数据库获取有关用户的信息?

Database view

在我的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);
    }

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。原来我不知道Firebase实际上是如何工作的。由于onDataChange()进行异步调用,因此在函数上编写监听器定义是无用的,因为onDataChange在函数终止之前通常不会触发,这会导致函数返回null值。 我在onCreate方法中定义了ValueEventListeners。它在我的ProfileFragment创建几秒后就会触发。我认为最好使用Progress Dialogs等待。

感谢所有对此问题感兴趣的人。