如何从dataSnapshot中获取值?

6
当我调试这段代码时,databaseUser 数据快照中包含了数据库中用户的值,但在对象 user1 中没有添加任何值,都是空的。我不理解这种情况,因为事件对象正常接收到值。
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;
} 

添加您的数据库结构并解释什么是getKeyEvents()。 - Martin De Simone
这段代码可行吗?你在范围内有重叠的 dataSnapshot 值。 - OneCricketeer
2个回答

10
当你对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);

2

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

你应该在你的 User 类中添加setter方法。

试一下,你不会后悔的。


这解决了我的问题。我通常使用 Kotlin 编写代码,但在使用 Java 时我忽略了这个问题。谢谢。 - Phill Wiggins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接