我成功地用以下代码获取了对象:
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);
那么,总而言之,如何返回
User
对象本身?谢谢
最佳答案
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) {}
});