Firestore - объединение двух запросов локально - PullRequest
0 голосов
/ 01 мая 2018

Поскольку в Firestore нет логического оператора OR, я пытаюсь объединить 2 отдельных запроса локально.

Теперь мне интересно, как я могу поддерживать правильный порядок результатов. Когда я выполняю 2 запроса независимо, я не могу указать результаты отдельно (по крайней мере, не порядок, в котором я получаю результаты из Firestore с помощью метода orderBy).

Моя идея заключалась в том, чтобы поместить второй запрос внутрь onSuccessListener первого запроса. Это плохая идея с точки зрения производительности?

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 Ответ

0 голосов
/ 02 мая 2018

Чтобы объединить 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(). Но в зависимости от варианта использования вашего приложения вы можете использовать метод eiter whenAllSuccess() или continueWith(). Пожалуйста, смотрите здесь официальную документацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...