Запрос firestore с помощью orderBy whereEqual и startAfter

Я хотел бы сделать recyclerView с нумерацией страниц в своем проекте. Однако я застрял в процессе.

Мои данные firestore построены следующим образом (некоторые документы имеют значение visible=false, поэтому я не хочу, чтобы они отображались):

Теперь мне нужно было получить первые 5 документов, упорядоченных по dateCreated, а затем продолжить разбиение на страницы по последнему значению, которое я ранее получил.

Я попытался использовать следующее:

db
    .collection( "Quotes" )
    .whereEqualTo( "visibility", true )
    .orderBy("dateCreated", Query.Direction.DESCENDING )
    .startAfter("dateCreated", dateCreatedOrig
    .get(dateCreatedOrig.size()-1))
    .limit(5)
    .get()
        .addOnCompleteListener( task -> {
            if (task.isSuccessful()) {
                for (QueryDocumentSnapshot document : task.getResult()) {
                        ...
                    }

                }

                dAdapter = new Ddapter(...);
                ddapter.notifyDataSetChanged();
                rv_Quotes.setAdapter( ddapter );

            }
        } );

Где dateCreatedOrig — это список, который содержит отметку времени первого запроса, поэтому я получаю последнюю отметку времени, чтобы продолжить разбиение на страницы оттуда.

Однако я получаю следующую ошибку:

java.lang.IllegalArgumentException: для startAfter() предоставлено слишком много аргументов. Количество аргументов должно быть меньше или равно количеству предложений orderBy().

Есть идеи?

get() не принимает никаких параметров. Кроме того, вы не закрыли скобки при вызове startAfter(). Это становится очевидным после того, как я переформатировал ваш код в вопросе.
Doug Stevenson 21.12.2020 07:43

Что вы подразумеваете под get() не принимает никаких параметров? Должен брать или не должен? По моему опыту, я никогда не вставлял в него параметры, как в этом случае.

Ben 21.12.2020 07:55

Посмотрите документацию по API для ясности. Если у вас нет исходного объекта для передачи, он не принимает аргументы. Ваш код явно пытается пройти dateCreatedOrig.size()-1)?

Doug Stevenson 21.12.2020 08:18

DateCreateOrig — потерянный, содержащий даты из первого запроса. Например, когда я впервые загрузил 5 результатов, я получил список из 5 значений метки времени, таких как 19.12.2020, 21.12.2020, 24.12.2020, 26.12.2020... Затем, когда я попытался разбить на страницы, я хотел, чтобы он запускался после документ, дата создания которого находится после 21.12.2020, например, который загрузит следующие 5 документов. Когда я написал dateCreatedOrog.size()-1, я попытался получить метку времени последнего документа из моего первого запроса. Я имею в виду, если я передам startAfter с пустым значением, как он узнает, откуда начинать запрос bext?

Ben 21.12.2020 16:51
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
0
4
664
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема здесь в том, что вы передаете 2 аргумента startAfter. Если вы посмотрите документацию для startAfter, вы увидите, что она:

Создает и возвращает новый запрос, который начинается после предоставленных полей относительно порядка запроса. Порядок значений полей должен совпадать с порядком по пунктам запроса

Это означает, что вы определяете имя поля, которое будет использоваться в предложении orderBy, а не в startAfter, и оба должны использоваться вместе. Итак, в вашем случае все, что нужно сделать, это удалить первый аргумент startAt, и это сработает, поэтому это может выглядеть так:

db.collection( "Quotes" )
  .whereEqualTo( "visibility", true )
  .orderBy("dateCreated", Query.Direction.DESCENDING )
  .startAfter(dateCreatedOrig.get(dateCreatedOrig.size()-1))
  .limit(5)
  .get()
  .addOnCompleteListener(...);

Рад помочь :)

Ralemos 23.12.2020 22:23

Другие вопросы по теме