Проверьте, существует ли поле - поиск в базе данных Firestore - PullRequest
0 голосов
/ 03 апреля 2020

Я делаю проект для школы - приложение android, которое регистрирует пользователей в базе данных в реальном времени после того, как проверяет, есть ли соответствующий номер карты и номер телефона в другой базе данных в Firestore. На данный момент он проверяет только первый документ, но не находит поля, если я ищу их в других документах.

Этот метод я использую:

    public void checkIfCardExists() {
    Query query = cardInfo.whereEqualTo("CardNo", cardNumber)
            .whereEqualTo("Phone", userPhone);

    query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    boolean documentExists;

                    if (task.isSuccessful()) {
                            Log.d("QueryResult", "Is query result empty: " + task.getResult().isEmpty());
                            documentExists = !task.getResult().isEmpty();

                    }else {
                        Log.e("QueryResult", "Error getting documents.", task.getException());
                        documentExists = false;
                    }

                    if(documentExists) {
                        Log.d("QueryResult", "The document exists");
                        Toast.makeText(com.example.transportticket.RegistrationLeap.this, "Card number found",
                                Toast.LENGTH_SHORT).show();
                        userLeap = new UserLeap(userEmail, userPass, userName, userSurname, cardNumber, userPhone);
                        registerUserLeap(userEmail, userPass);
                        startActivity(new Intent(RegistrationLeap.this, Empty.class));


                    }else{
                        Log.d("QueryResult", "The document doesn't exist or there was an error retrieving it");
                        Toast.makeText(com.example.transportticket.RegistrationLeap.this, "Card number not found",
                                Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(RegistrationLeap.this, Empty.class));
                    }
                }
            });
}

И так выглядит моя база данных Firestore база данных Firestore

Я добавил фото, чтобы уточнить, как найти первый документ

1 Ответ

1 голос
/ 03 апреля 2020

Если вы используете следующую строку кода:

Query query = cardInfo.whereEqualTo("CardNo", cardNumber)
        .whereEqualTo("Phone", userPhone);

Это означает, что вы указываете Firestore вернуть все документы, в которых свойство CardNo содержит значение cardNumber AND свойство Phone содержит значение userPhone. Таким образом, если в вашей коллекции только один документ удовлетворяет этому ограничению, будет возвращен один документ. Других документов в результатах не будет. То, что вы делаете сейчас, называется фильтрацией. Однако, если вы хотите получить все документы, вы должны удалить оба вызова whereEqualTo() или напрямую использовать cardInfo, который является CollectionReference объектом. Таким образом, вы ничего не фильтруете. Объект CollectionReference в основном представляет собой Запрос без каких-либо фильтров.

Таким образом, используя последнее решение, вы можете получить все документы, а также создать фильтрацию на клиенте. Это не рекомендуемый подход, потому что получение всех документов будет очень дорогостоящим. Например, если в вашей коллекции 1000 документов, вы заплатите 1000 операций чтения, чтобы получить их. Поэтому вам решать, какой из них лучше для вас.

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