java android firebase google-cloud-firestore

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 .