我正在开发一个带有firebase实时数据库的android应用程序。现在,我在执行查询之后寻找UserProfile
对象。因此我写了下面的文章来获得UserProfile
。
这是我的课
public class UserProfile {
@NonNull
private String id;
@NonNull
private String firstName;
private String lastName;
private String image;
@NonNull
private String email;
@NonNull
private Date created;
private Date updated;
// constructor, getter, setter & toString ...
}
数据库结构如下。
userProfile
|__ hD77qeMX3IPQcKGcuSBOgJOIhHk2
|__ created
| |__ date: 22
| |__ day: 0
| |__ hours: 21
| |__ minutes: 26
| |__ month: 3
| |__ seconds: 6
| |__ time: 1524421566951
| |__ timezoneOffset: -180
| |__ year: 118
|__ email: "[email protected]"
|__ firstName: "first_name"
|__ id: "hD77qeMX3IPQcKGcuSBOgJOIhHk2"
|__ lastName: "last_name"
这里是我得到错误的地方。
// query method
public UserProfile getUserProfile(String id) {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("userProfile");
final UserProfile[] userProfile = {null};
Query query = databaseReference.child(id);//orderByChild("id").equalTo(0);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
userProfile[0] = dataSnapshot.getValue(UserProfile.class);
// print statement for userProfile[0] shows the UserProfile exactly! which is not null
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return userProfile[0];
}
UserProfile
方法从firebase获取实际的用户配置文件,但最后onDataChange
方法返回空值。从getUserProfile
方法获取UserProfile
缺少什么? 最佳答案
这里缺少异步执行的点。添加侦听器以从firebase数据库检索值时,数据不能立即返回给调用方函数。在完成从firebase获取数据的后台onDataChanged
执行后,该数据将在AsyncTask
方法中可用。