Как избежать NullPointerException при удалении документа в Firestore? - PullRequest
0 голосов
/ 15 октября 2019

Я хочу дать пользователю в моем приложении возможность удалить свою учетную запись, поэтому, когда он нажимает кнопку удаления, удаляется документ, содержащий всю его информацию. Имя документа - его displayName, поэтому я получаю его в виде строки, но когда я запускаю код, который вы видите ниже, я получаю исключение NullpointerException в этой строке: String currentUsername = user.getDisplayName();, хотя displayName не равно нулю.

Редактировать:

Я нашел решение самостоятельно, см. Ответ ниже.

Вот мой метод:


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 ]

2 голосов
/ 16 октября 2019

Прежде всего вам нужно проверить, что текущий пользователь не равен нулю

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

, если текущий пользователь не равен нулю, тогда получите его имя и далее проверьте, что это имяне нуль.

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

, если имя не равно нулю, тогда удалите документ следующим образом:

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 голос
/ 15 октября 2019

Я думаю, вы неправильно поняли ошибку. Он говорит, что user является нулем, а не отображаемым именем. Это означает, что в настоящее время нет пользователей, вошедших в приложение. Вам нужно будет написать код для проверки этого случая.

Я также настоятельно рекомендую не использовать отображаемое имя в качестве идентификатора для документа в Cloud Firestore. Поскольку вы используете Firebase Authentication, у пользователя уже есть уникальный идентификатор , назначенный его учетной записи. Это предпочтительный способ хранения данных для каждого пользователя.

0 голосов
/ 15 октября 2019

Я обнаружил ошибку:

Я вызвал свой метод удаления после того, как использовал метод user.delete (), который удаляет вошедшего в систему пользователя, поэтому логически displayName также было удалено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...