首页 > 解决方案 > 使用当前用户 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)

标签: androidfirebase-authentication

解决方案


用户认证成功后访问数据库是安全的。

目前您正在尝试访问数据库而不考虑这一点。想想如果身份验证因错误的凭据而失败会发生什么。

所以,把你的代码移到里面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);  
    }
 }

推荐阅读