我想让我的应用程序中的用户可以删除其帐户,因此当他单击删除按钮时,将删除包含其所有信息的文档。文档的名称是他的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);
}
});
}
答案 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也被删除了。