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:
Puede solucionar esto, simplemente creando el lastVisible
como 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 lastVisible
objeto siempre tendrá el valor del último DocumentSnapshot
objeto.
PS Gracias por utilizar mi tutorial como un ejemplo para su paginación Firestore :)