0

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.


pcymichael
  • 95
  • 7

3 Answers3

1

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);
        }
    }
});
Alex Mamo
  • 130,605
  • 17
  • 163
  • 193
  • 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. – pcymichael Jun 03 '20 at 14:24
  • It knows because each property in the database is the same as in your model class. The entire object that exists in the database is mapped directly to a User object. – Alex Mamo Jun 03 '20 at 14:30
  • User object constructor parameter is unrelated to priority? If I change `private String email;` to `private String Email;`, it can work? – pcymichael Jun 03 '20 at 17:04
  • No, it won't work and this is happening because of **[this](https://stackoverflow.com/questions/52670456/images-not-loading-from-url-by-picasso-from-firebase-database/52706350#52706350)**. – Alex Mamo Jun 03 '20 at 17:08
1

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

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) { }
});
Manas Muda
  • 23
  • 4