java - 从 Firebase 实时数据库中选择
问题描述
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)
我的数据库有这样的结构:
我的数据库结构:
但是我没有得到用户,有人可以告诉我选择是否错误吗?
我创建的 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();
解决方案
解决方案(临时):
首先我要再次感谢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", user[0]);
开始活动(意图);
结束();
1)我的日志显示它开始了活动,奇怪的是选择表单数据库是在活动开始之后而不是之前完成的
2)选择完成我得到了用户对象但它没有时间把它放在会话(意图)中因为我从来没有在第二个活动中得到它所以我的解决方案只是在最后一行代码之后启动活动从 FirebaseDB 获取用户时
推荐阅读
- spotify - Spotify SDK 身份验证未登录
- ios - tableView.reloadData() 和 DispatchQueue 无法在不同的视图控制器中重新加载 tableview
- sql - 如何在 SQL 存储过程中生成可读的名称?
- vscode-settings - CodeRunner 不在 VS 上显示 JS 输出
- perl - Perl 脚本删除换行符并将下一行数据移动到上一行
- android - 如何添加在其他应用程序中显示的功能
- javascript - 如何避免 React.js 中的这种无限更新循环?
- python - 如何根据另一个表中的数据过滤一个表
- java - 如何在 Android Studio 中修复我的旧应用程序?
- python - Tkinter 中 Canvas 的 tag_bind 方法