Como llegar última DocumentSnapshot visible en una tarea combinada para consultas FireStore?

Sabeeh Ul Haq:

Estoy combinando dos consultas para hacer el "no es igual a" consulta de una colección Firestore que no es posible de forma nativa en Firestore así que tengo que hacerlo localmente. Necesito conseguir el último documento visible de mi tarea combinada de usar para paginación.

Lo que sigue es el código que estoy escribiendo para obtener una lista de documentos de ambos resultados de la consulta.

    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()

        }
    });

En la linea

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

Yo sólo puede acceder a cualquiera de los documentos de mi primera consulta o mi segunda consulta, así que estoy seguro de cómo obtener el último documento visible, creo que el último documento sería de mi segunda consulta, lógicamente, pero no estoy seguro.

Aquí está el tutorial que estaba siguiendo para lograr esto:

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

Alex Mamo :

Puede solucionar esto, simplemente creando el lastVisiblecomo una variable global en su clase:

private DocumentSnapshot lastVisible;

Y luego assignin un valor en el bucle for:

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
    }
});

Ver la llamada a .startAfter(lastVisible)? Así que esto va a funcionar, porque al final del bucle, el lastVisibleobjeto siempre tendrá el valor del último DocumentSnapshotobjeto.

PS Gracias por utilizar mi tutorial como un ejemplo para su paginación Firestore :)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=361700&siteId=1
Recomendado
Clasificación