Как получить последний видимый DocumentSnapshot в комбинированной задаче для запросов Firestore? - PullRequest
0 голосов
/ 28 марта 2020

Я объединяю два запроса, чтобы выполнить запрос «не равный» для коллекции Firestore, который изначально невозможен в Firestore, поэтому я должен сделать это локально. Мне нужно получить последний видимый документ моей комбинированной задачи для разбивки на страницы.

Ниже приведен код, который я пишу, чтобы получить список документов по обоим результатам запроса.

    Query first = firebaseFirestore
            .collection("jobs")
            .whereGreaterThan("createdBy",currentUser.getEmail())
            .orderBy("createdDate",Query.Direction.ASCENDING)
            .limit(2);
    Query second = firebaseFirestore
            .collection("jobs")
            .whereLessThan("createdBy",currentUser.getEmail())
            .orderBy("createdDate",Query.Direction.ASCENDING)
            .limit(2);

    Task<QuerySnapshot> firstTask = first.get();
    Task<QuerySnapshot> secondTask = second.get();


    final Task<List<QuerySnapshot>> combinedTask = Tasks.whenAllSuccess(firstTask, secondTask);
    combinedTask.addOnSuccessListener(new OnSuccessListener<List<QuerySnapshot>>() {
        @Override
        public void onSuccess(List<QuerySnapshot> querySnapshots) {
            List<Job> list = new ArrayList<>();
            for(QuerySnapshot qs: querySnapshots){
                for(DocumentSnapshot document: qs){
                    Job job = document.toObject(Job.class);
                    list.add(job);
                }
            }

            JobAdapter jobAdapter = new JobAdapter(list);
            recyclerView.setAdapter(jobAdapter);

            DocumentSnapshot lastVisible = combinedTask.getResult().get()

        }
    });

В строке

 DocumentSnapshot lastVisible = combinedTask.getResult().get()

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

Вот учебник, которому я следовал, чтобы выполнить sh это:

https://www.youtube.com/watch?v=KdgKvLll07s

1 Ответ

0 голосов
/ 29 марта 2020

Вы можете решить эту проблему, просто создав lastVisible как глобальную переменную в своем классе:

private DocumentSnapshot lastVisible;

И затем присвоив значение в для l oop:

final Task<List<QuerySnapshot>> combinedTask = Tasks.whenAllSuccess(firstTask, secondTask);
combinedTask.addOnSuccessListener(new OnSuccessListener<List<QuerySnapshot>>() {
    @Override
    public void onSuccess(List<QuerySnapshot> querySnapshots) {
        List<Job> list = new ArrayList<>();
        for(QuerySnapshot qs: querySnapshots){
            for(DocumentSnapshot document : qs){
                Job job = document.toObject(Job.class);
                list.add(job);
                lastVisible = qs.getDocuments().get(qs.size() - 1);
            }
        }
        Query nextQuery = firebaseFirestore
                .collection("jobs")
                .whereGreaterThan("createdBy",firebaseAuth.getCurrentUser().getEmail())
                .orderBy("createdDate",Query.Direction.ASCENDING)
                .startAfter(lastVisible)
                .limit(2);

        //Use the nextQuery
    }
});

Видите звонок на .startAfter(lastVisible)? Так что это сработает, потому что в конце для l oop объект lastVisible всегда будет содержать значение последнего DocumentSnapshot объекта.

PS Спасибо за использование моего урока в качестве примера для ваша страничка Firestore:)

...