从Firebase实时数据库中选择

时间:2018-05-05 17:05:45

标签: java android firebase firebase-realtime-database

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

它一直在给我

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)

我的数据库有这样的结构:
My DB structure:

但是我没有得到用户,有人可以告诉我,如果我选错了吗?

我创建的USER类,我没有包含每个属性的get和set,以便不构成文本墙:

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 )

我调用我的主要方法来获取用户:

User userObject = FirebaseRealtimeDBUtils.getUser(USER_FIREBASE_ID);

其中

USER_FIREBASE_ID is auth.getUid();

1 个答案:

答案 0 :(得分:1)

<强> SOLUTION( TEMPORARY ):
首先,我想再次感谢你 Levi Albuquerque ,我通过这样做解决了我的问题:   - 我没有使用方法,我正在我需要响应的类中直接进行选择(对象用户)(相同的选择)   - 这就是我得到的:

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

我这样做有两个原因:
 intent.putExtra(“SESSION_USER”,用户[0]);
                                                            startActivity(意向);
                                                                                        光洁度();

1 )我的日志显示它启动了活动,奇怪的是选择表单 DB 是在活动开始之前完成的

2 )选择完成后我得到了用户对象,但没有时间把它放在会话中(意图)因为我从来没有在第二个活动中得到它所以我的解决方案只是从FirebaseDB

获取用户时,在最后一行代码之后启动活动