Reputation: 53
public static User getUser(String userFirebaseID){
Log.d("Activitati","<<<< IN FirebaseRealtimeDBUtils.getUser() >>>> ");
Log.d("Activitati","userFirebaseID: "+userFirebaseID);
final User[] user = new User[1];
// Get a reference to our posts
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("USERS");
ref.child(userFirebaseID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//for(DataSnapshot child: dataSnapshot.getChildren()){
Log.d("Activitati","dataSnapshot: "+dataSnapshot.toString());
user[0] = dataSnapshot.getValue(User.class);
doSomethingWithUser(user[0]);
Log.d("Activitati",getClass().getName()+" User object: "+ user[0]);
Log.d("Activitati",getClass().getName()+" User email address from DB: "+ user[0].getEmailAddress());
//}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("Activitati",getClass().getName()+" DB ERROR: "+databaseError.getMessage());
}
});
Log.d("Activitati","<<<< OUT FirebaseRealtimeDBUtils.getUser() >>>> ");
return user[0];
}
public static void doSomethingWithUser(User user){
Log.d("Activitati"," User email address from DB: "+ user.getEmailAddress());
}
It keeps giving me
Process: ro.LearnByPlaying.Activitati, PID: 16319
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String ro.LearnByPLaying.Beans.User.getEmailAddress()' on a null object reference
at ro.LearnByPLaying.Activitati.LoginActivity$1$2.onComplete(LoginActivity.java:104)
at com.google.android.gms.tasks.zzj.run(Unknown Source:23)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
And my database has this structure:
My DB structure:
But I don't get the user , can someone tell me if I did the select wrong ?
The USER class I have created, I didn't include the get and set for each propertie to not make a wall of text:
public class User implements Serializable{
private String firstName;
private String lastName;
private String nickName;
private Date dateOfBirth;
private String country;
private String town;
private String phoneNumber;
private String phoneModel;
private String emailAddress;
private String userFirebaseID;
private String dateAccountCreated;
... (getters and setters are generated too )
and I call my main method for getting the user like this:
User userObject = FirebaseRealtimeDBUtils.getUser(USER_FIREBASE_ID);
where
USER_FIREBASE_ID is auth.getUid();
Upvotes: 1
Views: 62
Reputation: 53
SOLUTION(TEMPORARY):
First I want to thank you again Levi Albuquerque , i resolved my problem by doing this:
- I am not using a method ,I am doing the select directly in the class that I need the response(object User) (THE SAME SELECT)
- and this is what I got:
final User[] user = new User[1];
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("USERS");
ref.child(USER_FIREBASE_ID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
user[0] = dataSnapshot.getValue(User.class);
Log.d("Activitati", "child email: ---------- " + user[0].getEmailAddress());
intent.putExtra("SESSION_USER", user[0]);
startActivity(intent);
finish();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("Activitati", getClass().getName() + " DB ERROR: " + databaseError.getMessage());
}
});
I did this for 2 reasons:
intent.putExtra("SESSION_USER", user[0]);
startActivity(intent);
finish();
1) My log was showing me that it started the activity and weirdly the select form DB was done after the activity started not before
2) The select was done i got the user object but it didn't have time to put it in session(intent) cause i never got it in the second activity so my solutions was just to start the activity after the last line of code when getting the user from FirebaseDB
Upvotes: 1