如何从dataSnapshot获取价值?

时间:2017-07-29 15:31:37

标签: java android firebase firebase-realtime-database

当我调试此代码时,在databaseUser中dataSnapshot具有来自User in database的值,但是在对象user1中没有添加,它全部为null。我不明白,因为在对象事件中正常接收值。

databaseEvent.child(getKeyEvent()).addListenerForSingleValueEvent( 
      new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

               final Event event = dataSnapshot.getValue(Event.class);
               user = FirebaseAuth.getInstance().getCurrentUser();
               if(user != null) {

                   databaseUser.orderByChild("userEmail").equalTo(user.getEmail()).addListenerForSingleValueEvent(new ValueEventListener() {
                     @Override
                     public void onDataChange(DataSnapshot dataSnapshot) {
                         if (dataSnapshot.exists()) {
                             //User already exists
                             User user1 = dataSnapshot.getValue(User.class);
              }
       }
});

我的数据库用户,仅供测试:

public class User {

String userId;
String userEmail;
Boolean userHasInterest;
String eventId;

public String getUserId() {
    return userId;
}
public String getUserEmail() {
    return userEmail;
}

public Boolean getUserHasInterest() {
    return userHasInterest;
}

public String getEventId() {
    return eventId;
}

public User(String userId, String eventId, String userEmail, Boolean userHasInterest) {
    this.userId = userId;
    this.userEmail = userEmail;
    this.userHasInterest = userHasInterest;
    this.eventId = eventId;
}

这个方法,只是为了选择另一个活动事件的关键:

public String getKeyEvent(){
    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    String key = bundle.getString("Evento");
    return key;
} 

2 个答案:

答案 0 :(得分:5)

对Firebase数据库执行查询时,可能会有多个结果。通过附加ValueListener,您可以将这些结果放在一个快照中,因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

您的代码未能将此“结果列表”考虑在内。通过循环DataSnapshot.getChildren()

可以轻松修复
databaseUser.orderByChild("userEmail").equalTo(user.getEmail()).addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
     for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
         User user1 = userSnapshot.getValue(User.class);

答案 1 :(得分:1)

我曾经遇到过这个问题,解决方案非常棒。

您应该在User课程中添加setter。

尝试一下,你不会后悔的。