从Firebase检索Java对象

时间:2016-04-28 11:07:36

标签: java android firebase

我设法用这段代码获取对象:

age

(请注意public void retrieveUser(final String email){ firebaseUsersRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) { if(messageSnapshot.getKey().equals(Email.encodeID(email))){ retrievedUser = messageSnapshot.getValue(User.class); break; } } } @Override public void onCancelled(FirebaseError firebaseError) { } }); } 是一个类属性,因此是一个字段。)

我从代码中访问该字段,但即使我看到它在调试器上获取值,它在调用代码上也为空。

任何提示?我不能只在方法本身中返回它,所以它会是?:

retrievedUser

那么,总结一下,我如何返回public User retrieveUser(final String email); 对象本身?

由于

2 个答案:

答案 0 :(得分:3)

Firebase加载并同步数据异步。您无法确定您的字段retrievedUser在访问时会有值,因为您不知道Firebase何时会调用onDataChange事件。

您必须在retrievedUser事件处理程序中执行取决于onDataChange的工作。

firebaseUsersRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
            if(messageSnapshot.getKey().equals(Email.encodeID(email))){
                retrievedUser = messageSnapshot.getValue(User.class);
                doSomethingWithTheUser(retrievedUser);
            }
        }
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {}
});

答案 1 :(得分:2)

您应该能够使用回调或返回语句返回retrieveUser对象。下面是一些代码,展示了如何使用回调返回值。

    @Override
public void getEvents(final LoadEventsCallback callback) {

    final List<Event> events = new ArrayList<Event>();

    Firebase ref = new Firebase("https://austin-feeds-me.firebaseio.com/events");
    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                Event event = snapshot.getValue(Event.class);
                events.add(event);
            }
            callback.onEventsLoaded(events);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

}