Firestore - Локальное объединение двух запросов
Поскольку в Firestore нет логического OR
оператора, я пытаюсь локально объединить 2 отдельных запроса.
Теперь мне интересно, как я могу поддерживать правильный порядок результатов. Когда я запускаю 2 запроса независимо, я не могу определить результаты конкретно (по крайней мере, не порядок, в котором я получаю результаты из Firestore с помощью orderBy
метода).
Моя идея заключалась в том, чтобы поместить 2-й запрос внутрь onSuccessListener
1-го запроса. Плохая ли это идея с точки зрения производительности?
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
}
}
});
}
});
}
Переведено автоматически
Ответ 1
Чтобы локально объединить 2 отдельных запроса, я рекомендую вам использовать Tasks.whenAllSuccess()
метод. Вы можете добиться этого, используя следующие строки кода:
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
}
});
Как вы можете видеть, при переопределении onSuccess()
метода результатом является list
набор объектов, который имеет точный порядок задач, которые были переданы в качестве аргументов в whenAllSuccess()
метод.
Существует и другой подход, который заключается в использовании Tasks.continueWith()
метода. Но в зависимости от варианта использования вашего приложения вы можете использовать любой из whenAllSuccess()
методов или continueWith()
method . Пожалуйста, ознакомьтесь здесь с официальной документацией.