【问题标题】:Why does DataSnapshot return null?为什么 DataSnapshot 返回 null?
【发布时间】:2020-09-21 23:53:48
【问题描述】:

我想从 Firebase 读取数据,但 Log.d("Uservalue", ""+value); 为我返回 null,我该怎么办?

MainActivity.java:

FirebaseUser user = mAuth.getCurrentUser();
DatabaseReference myRef = FirebaseDatabase.getInstance().getReference("USERS").child(user.getUid());

User user1 = new User(user.getEmail(), user.getDisplayName(), user.getUid(), user.getPhotoUrl().toString());

/*  write to firebase database  */
myRef.setValue(user1);

/*read*/
myRef.child(user.getUid()).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        User value = dataSnapshot.getValue(User.class);
        Toast.makeText(MainActivity.this, "User", Toast.LENGTH_SHORT).show();
        Log.d("Uservalue", ""+value);
    }
    @Override
    public void onCancelled(DatabaseError databaseError) { }
});

用户.java:

public class User{
    private String email;
    private String id;
    private String imgurl;
    private String name;

    public User(){
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }
    public User(String email, String name, String id, String imgurl) {
        this.email = email;
        this.id = id;
        this.imgurl = imgurl;
        this.name = name;
    }
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getname() {
        return this.name;
    }

    public void setname(String username) {
        this.name = username;
    }

    public String getImgurl() {
        return imgurl;
    }

    public void setImgurl(String imgurl) {
        this.imgurl = imgurl;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

还有我的firebase数据:

而 Logcat 返回 null

020-06-03 17:53:12.810 8720-8720/com.example.chatapp D/Uservalue: null

谁能帮帮我?谢谢。


然后 我想问一个问题,为什么User value = dataSnapshot.getValue(User.class);知道firebase中的名字=User中的名字,firebase中的email=User中的email……,这样我用value.getName()就可以得到我名字的数据了。


【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    以下对setValue()的调用:

    myRef.setValue(user1);
    

    这是一个异步操作。因此,如果您想使用(读取)该数据,您应该等到写入操作完成。所以请检查以下代码行:

    uidRef.setValue(user1).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
                DatabaseReference uidRef = rootRef.child("USERS").child(uid);
                ValueEventListener valueEventListener = new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        User user = dataSnapshot.getValue(User.class);
                        Log.d("TAG", user.getName());
                    }
    
                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
                    }
                };
                uidRef.addListenerForSingleValueEvent(valueEventListener);
            }
        }
    });
    

    【讨论】:

    • 我想问一个问题,为什么User value = dataSnapshot.getValue(User.class);知道firebase中的名字=User中的名字,firebase中的email=User中的email……,所以我用@987654326 @可以获取我的姓名数据。
    • 它知道是因为数据库中的每个属性都与模型类中的相同。数据库中存在的整个对象直接映射到一个用户对象。
    • 用户对象构造函数参数与优先级无关?如果我把private String email;改成private String Email;,可以吗?
    • 不,它不会起作用,这是因为 this 而发生的。
    【解决方案2】:

    您的 myRef 已经在 USERS/$uid 节点上。因此,将您的 ValueEventListener 更改为

    myRef.addValueEventListener(new ValueEventListener() {
         @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
     {
            User value = 
    dataSnapshot.getValue(User.class);
        Toast.makeText(MainActivity.this, "User", 
     Toast.LENGTH_SHORT).show();
        Log.d("Uservalue", ""+value);
       }
        @Override
         public void onCancelled(DatabaseError databaseError) { }
       });
    

    编辑:或将您的数据库引用更改为

      myRef=FirebaseDatabase().getInstance(). getReference("USERS");
      myRef.child(user.getUid).setValue(your data);
     myRef.child(user.getUid).addValueEventListener(//the rest are same
     );
    

    【讨论】:

      【解决方案3】:

      你的 myRef 已经指向你的用户节点

      DatabaseReference myRef = FirebaseDatabase.getInstance().getReference("USERS").child(user.getUid());
      


      您正在尝试通过提及 uid 来收听用户节点的另一个分支

      myRef.child(user.getUid()).addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
              User value = dataSnapshot.getValue(User.class);
              Toast.makeText(MainActivity.this, "User", Toast.LENGTH_SHORT).show();
              Log.d("Uservalue", ""+value);
          }
          @Override
          public void onCancelled(DatabaseError databaseError) { }
      });
      

      把这段代码改成这个

      myRef.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
              User value = dataSnapshot.getValue(User.class);
              Toast.makeText(MainActivity.this, "User", Toast.LENGTH_SHORT).show();
              Log.d("Uservalue", ""+value);
          }
          @Override
          public void onCancelled(DatabaseError databaseError) { }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 2022-12-26
        • 2016-12-28
        • 1970-01-01
        • 2015-11-25
        • 2015-07-04
        相关资源
        最近更新 更多