pcymichael
pcymichael

Reputation: 95

Why does DataSnapshot return null?

I want to read data from Firebase but Log.d("Uservalue", ""+value); return null for me, what should I do?

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

And my firebase data: enter image description here

And Logcat return null

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

Can anyone help me? Thank you.


And then I want to ask a question, why User value = dataSnapshot.getValue(User.class); know the name in firebase = name in User, the email in firebase = email in User ......, so that I use value.getName() can get my name's data.


Upvotes: 0

Views: 95

Answers (3)

Manas Muda
Manas Muda

Reputation: 23

Your myRef is already pointing to your user node

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


You are trying listen to another branch of your user node by mentioning 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) { }
});

Change this code to this

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

Upvotes: 1

user11554071
user11554071

Reputation:

Your myRef is already on USERS/$uid node. So change your ValueEventListener to

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

Edit: Or change your Database Reference to

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

Upvotes: 1

Alex Mamo
Alex Mamo

Reputation: 138824

The following call to setValue():

myRef.setValue(user1);

It's an asynchronous operation. So if you want to use (read) that data, you should wait until the write operation is completed. So please check the following lines of code:

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

Upvotes: 1

Related Questions