为什么DataSnapshot返回null?

时间:2020-06-03 10:04:49

标签: java android firebase firebase-realtime-database

我想从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) { }
});

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

我的火力地堡数据: enter image description here

Logcat返回null

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

有人可以帮助我吗?谢谢。


然后 我想问一个问题,为什么User value = dataSnapshot.getValue(User.class);知道firebase中的名称=用户中的名称,firebase中的电子邮件=用户......中的电子邮件,以便我使用value.getName()可以得到我的名称的数据。


3 个答案:

答案 0 :(得分: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);
        }
    }
});

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您的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) { }
});
相关问题