Firestore: почему мой код не вызывает "if (! Document.exists ())"? - PullRequest
0 голосов
/ 09 марта 2020

Мое намерение здесь состоит в том, чтобы отобразить сообщение Toast, если пользователь вводит комбинацию электронной почты и пароля, которая не соответствует ни одному из профилей пользователей в базе данных Firestore.

Я пробовал это несколькими способами, но он отказывается вызывать код внутри "if (! document.exists ()))." Я попытался опустить "(! Document.exists) и просто использовать" else "- ничего.

Все остальное прекрасно работает." If (document.exists ()) "с радостью возвращает информацию и входит в систему. Пожалуйста, дайте мне знать, если мне нужно добавить больше информации!

FirestoreRepository:

    public void queryUserByEmailPassword(String email, String password) {
        Query userQuery = userColRef.whereEqualTo("email", email).whereEqualTo("password", password);
        userQuery.get().addOnCompleteListener(querySnapshotOnCompleteListener);
    }

LoginViewModel:

    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot doc : task.getResult()) {
                if (!document.exists()) { // this code will NOT execute
                    Log.d(TAG, "Error getting documents: ", task.getException());
                    return;
                } else { // this code executes flawlessly
                    user = doc.toObject(User.class);
                    currentUser.setValue(user);
                    doesUserExist.setValue(true);
                    repo.signIn(user.getEmail(), user.getPassword());
                }
            }
        }
    }

1 Ответ

1 голос
/ 09 марта 2020

Похоже, вы предполагаете, что ошибка запроса приведет к тому, что документ будет отображаться в QueryDocumentSnapshot. Это не так, как это работает. Если с запросом произошла ошибка, task.isSuccessful() вернет false. В данный момент вы не проверяете этот случай.

Если ваш запрос не возвращает документов, то ваш for l oop не будет выполнен вообще. Не считается «ошибкой» получение нулевых документов. Если вам нужно узнать, нет ли документов в результате, вы должны проверить, что QuerySnapshot не содержит документов:

if (task.isSuccessful()) {
    QuerySnapshot qs = task.getResult();
    if (qs.size() == 0) {
        // the query returned no documents - decide what to do
    }
    else {
        // iterate the documents here
        for (QueryDocumentSnapshot snapshot : qs) {
        }
    }
}
else {
    // there was an error, use task.getException() to figure out what happened
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...