java - Firestore-fusionando dos consultas localmente
android firebase (1)
Como no hay un operador
OR
lógico en Firestore, estoy intentando fusionar 2 consultas separadas localmente.
Ahora me pregunto cómo puedo mantener el orden correcto de los resultados.
Cuando ejecuto 2 consultas de forma independiente, no puedo ordenar los resultados específicamente (al menos no el orden en el que obtengo los resultados de Firestore con el método
orderBy
).
Mi idea fue colocar la segunda consulta dentro de
onSuccessListener
de la primera consulta.
¿Es esta una mala idea el rendimiento?
public void loadNotes(View v) {
collectionRef.whereLessThan("priority", 2)
.orderBy("priority")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
Note note = documentSnapshot.toObject(Note.class);
//adding the results to a List
}
collectionRef.whereGreaterThan("priority", 2)
.orderBy("priority")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
Note note = documentSnapshot.toObject(Note.class);
//adding the results to a List
}
}
});
}
});
}
Para combinar 2 consultas separadas localmente, te recomiendo que
Tasks.whenAllSuccess()
método
Tasks.whenAllSuccess()
.
Puedes lograr esto, usando las siguientes líneas de código:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query firstQuery = rootRef...
Query secondQuery = rootRef...
Task firstTask = firstQuery.get();
Task secondTask = secondQuery.get();
Task combinedTask = Tasks.whenAllSuccess(firstTask, secondTask).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
@Override
public void onSuccess(List<Object> list) {
//Do what you need to do with your list
}
});
Como puede ver, al anular el método
onSuccess()
, el resultado es una
list
de objetos que tiene el orden exacto de las tareas que se pasaron como argumentos en el método
whenAllSuccess()
.
También hay otro enfoque y sería utilizar el método
Tasks.continueWith()
.
Pero de acuerdo con el caso de uso de su aplicación, puede usar el método
whenAllSuccess()
o el método
continueWith()
.
Por favor vea aquí la
documentación oficial
.