Reputation: 95
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 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
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
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
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