Запрос Firestore не попадет в repsonse

#android #firebase #google-cloud-firestore

#Android #firebase #google-облако-firestore

Вопрос:

Я запрашиваю firestore с помощью запроса arrayContain, и мой код переходит в метод onSuccess, но он не переходит в цикл for. Он пропускает его и сразу переходит к добавлению списка в адаптер.

Я отладил его, и он просто не войдет в этот цикл for.

 CollectionReference mRef = FirebaseFirestore.getInstance().collection("movies");
String s = "Captain Marvel";
mRef.whereArrayContains("title", s)
                    .get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                    List<Movie> searchedMovies = new ArrayList<>();
                    for (QueryDocumentSnapshot document : queryDocumentSnapshots) {
                        Movie movie = document.toObject(Movie.class);
                        searchedMovies.add(movie);
                    }
                    mAdapter.addNewMovies(searchedMovies);
                }
});
  

введите описание изображения здесь

Комментарии:

1. что он показывает во время отладки…

2. Отладчик показывает, что searchedMovies пуст, и мой метод mAdapter выдает ошибку, потому что ему нужен непустой список.

Ответ №1:

Ваш запрос не возвращает результатов. Это потому, что вы выполняете запрос array contains к полю, которое не является массивом. Насколько я могу видеть, title — это строка, а не массив.

Когда вы получаете результаты поиска в обратном вызове OnSuccessListener, вы должны проверить, содержит ли QuerySnapshot даже результаты, прежде чем предполагать, что есть результаты для итерации. Согласно документации API, существует метод isEmpty, который вы можете использовать, чтобы узнать, есть ли результаты.

Поскольку ваше поле заголовка представляет собой строку, а не массив, возможно, вам следует использовать запрос wherequalto вместо whereArrayContains для его поиска.

Комментарии:

1. Это сработало лучше, теперь я добавляю фильмы в список. Спасибо! Но это приведет только к поиску заголовка с точным заголовком. Я не видел никаких методов поиска по частичному названию. Например. «title» = «Капитан Марвел», и я хочу иметь возможность искать это название, просто выполнив поиск «капитан».

2. В Firestore нет подстрочных, нечувствительных к регистру совпадений строк.