如何从dataSnapshot获得价值? [英] How get value from dataSnapshot?

查看:112
本文介绍了如何从dataSnapshot获得价值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我调试这段代码的时候,在databaseUser中dataSnapshot有来自User的数据库的值,但是在对象 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(); $ b $ if(user!= null){

databaseUser.orderByChild(userEmail)。equalTo(user.getEmail ))。addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){$ b $ if(dataSnapshot.exists()){
//用户已经存在
User user1 = dataSnapshot.getValue(User.class);
}
}
});

我的数据库用户只能用于现在的测试:

  public class User {

String userId;
字符串userEmail;
布尔userHasInterest;
字符串eventId;

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

$ b $ public Boolean getUserHasInterest(){
return userHasInterest;
}

public String getEventId(){
return eventId;

$ b $ 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);
返回键;


解决方案

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);


When I debug this code, in databaseUser dataSnapshot has the values from User in database, but in the object user1, did not add, it's all null. And I don't understand, because in the object event receives values normally.

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);
              }
       }
});

My Database User, only for test for now:

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;
}

And the method, just to pick the key of the event of another activity :

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

解决方案

When you execute a query against the Firebase Database, there will potentially be multiple results. By attaching a ValueListener you get those results in one snapshot, so the snapshot contains a list of those results. Even if there is only a single result, the snapshot will contain a list of one result.

Your code fails to take this "list of results" into account. It's easy to fix by looping over the 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);

这篇关于如何从dataSnapshot获得价值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆