在Firestore中删除文档时如何避免NullPointerException?

时间:2019-10-15 16:07:17

标签: android firebase google-cloud-firestore

我想让我的应用程序中的用户可以删除其帐户,因此当他单击删除按钮时,将删除包含其所有信息的文档。文档的名称是他的displayName,所以我将其作为字符串获取,但是在运行代码时,您在下面看到的是这一行:NullpointerException:  String currentUsername = user.getDisplayName(); 即使displayName不为null。

编辑:

我自己找到了解决方案,请参见下面的答案。

这是我的方法:


btn_delete_account.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

                user.delete()
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    deleteDocument();
                                }
                            }
                        });
            }
        });

...

public void deleteDocument (){

        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

        String currentUsername = user.getDisplayName();

        db.collection("User").document(currentUsername)
                .delete()
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "DocumentSnapshot successfully deleted!");
                        Toast.makeText(PersonalSettings.this, "Your account was successfully deleted.", Toast.LENGTH_SHORT).show();
                        Intent i = new Intent(PersonalSettings.this, SignInActivity.class);
                        startActivity(i);
                        finish();
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "Error deleting document", e);
                    }
                });
    }

3 个答案:

答案 0 :(得分:2)

首先必须检查当前用户是否为空

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if(user==null)
{
 return;
}

如果当前用户不为空,则获取其名称,并进一步检查其名称是否为空。

String currentUsername = user.getDisplayName();
if(TextUtils.isEmpty(currentUsername))
 {
  return;
 }
  

如果名称不为null,则按以下步骤删除文件:

public void deleteDocument (){

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
     if(user==null)
     {
      return;
     }

    String currentUsername = user.getDisplayName();
     if(TextUtils.isEmpty(currentUsername))
     {
        return;
     }

    db.collection("User").document(currentUsername)
            .delete()
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d(TAG, "DocumentSnapshot successfully deleted!");
                    Toast.makeText(PersonalSettings.this, "Dein Account wurde erfolgreich gelöscht.", Toast.LENGTH_SHORT).show();
                    Intent i = new Intent(PersonalSettings.this, SignInActivity.class);
                    startActivity(i);
                    finish();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Error deleting document", e);
                }
            });
}

答案 1 :(得分:1)

我认为您误解了错误。就是说user为null,而不是显示名称。这意味着当前没有用户登录到该应用程序。您将必须编写一些代码来检查这种情况。

我还强烈建议不要将显示名称用作Cloud Firestore中文档的ID。由于您使用的是Firebase身份验证,因此用户已经为自己的帐户分配了unique ID。这是存储每个用户数据的首选方式。

答案 2 :(得分:1)

我发现了错误:

使用user.delete()方法删除登录用户后,我调用了delete方法,因此从逻辑上说,displayName也被删除了。