android - 使用当前用户 ID 作为 firebase 数据库中的参考节点
问题描述
我正在尝试获取经过身份验证的用户 id 以将其作为 child(userID) 方法的参数传递为 firebase 数据库中的引用节点,但它给出了一个空指针异常。
正如它应该做的那样,我首先登录以获取当前用户的ID
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
firebaseAuth = FirebaseAuth.getInstance();
firebaseSignIn();
Log.i("userID", "user id is: " + userID);
databaseReference = FirebaseDatabase.getInstance().getReference().child("users available");
userReference = databaseReference.child(userID); //error line
}
public void firebaseSignIn() {
String email = PreferenceManager.getDefaultSharedPreferences(getBaseContext()).getString("email", "");
String password = PreferenceManager.getDefaultSharedPreferences(getBaseContext()).getString("password", "");
Log.i(getClass().getName(), "email is: " + email + "and password is: " + password);
if(email.equals("") || password.equals(""))
startActivity(new Intent(MapsActivity.this, WelcomeActivity.class));
else {
firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
userID = FirebaseAuth.getInstance().getCurrentUser().getUid();
Log.i("userID", "user id is: " + userID);
Toast.makeText(MapsActivity.this, R.string.signed_in, Toast.LENGTH_LONG).show();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MapsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
}
这是我得到的错误。
Caused by: java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
at com.google.firebase.database.DatabaseReference.child(com.google.firebase:firebase-database@@17.0.0:101)
at com.example.findnurse.MapsActivity.onCreate(MapsActivity.java:116)
at android.app.Activity.performCreate(Activity.java:7340)
at android.app.Activity.performCreate(Activity.java:7331)
解决方案
用户认证成功后访问数据库是安全的。
目前您正在尝试访问数据库而不考虑这一点。想想如果身份验证因错误的凭据而失败会发生什么。
所以,把你的代码移到里面onComplete
:
@Override public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
userID = FirebaseAuth.getInstance().getCurrentUser().getUid();
Log.i("userID", "user id is: " + userID); Toast.makeText(MapsActivity.this, R.string.signed_in, Toast.LENGTH_LONG).show();
databaseReference = FirebaseDatabase.getInstance().getReference().child("users available");
userReference = databaseReference.child(userID);
}
}
或者至少在参考之前检查 userID 是否为空:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
firebaseAuth = FirebaseAuth.getInstance();
firebaseSignIn();
Log.i("userID", "user id is: " + userID);
if(FirebaseAuth.getInstance().getCurrentUser() != null) { //Check it here
userID = FirebaseAuth.getInstance().getCurrentUser().getUid();
databaseReference = FirebaseDatabase.getInstance().getReference().child("users available");
userReference = databaseReference.child(userID);
}
}
推荐阅读
- php - #PBS scipts 没有输出
- python - django.core.exceptions.ImproperlyConfigured: Cannot import 'category'. Check that 'api.category.apps.CategoryConfig.name' is correct
- swift - 从 Vimeo Swift 5 中的文件夹中检索视频列表
- python - 如何更改 discord-py-slash 命令的顺序
- android - Android 外部存储权限即将发生的变化
- r - 如何在 Rstudio 中使用 grep 和 fread?
- matplotlib - 为新闻散布图添加标签
- javascript - 如何使我的随机图像选择器从随机选择变为顺序选择?
- javascript - 如何将控制台日志结果传递给我的 ajax,以便我可以将其插入 DB?
- html - 通过浏览器直接访问时 index.html 文件不显示样式