Запрос Firestore в цикле For - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь получить данные из Firestore, где поле "simpleDate" равно массиву строк (дат).

Итак, ArrayList<String> uniqueDates = new ArrayList<String>(); содержит несколько строк:

[19/03/2020, 18/03/2020, 14/03/2020] ....

Я хочу выполнить итерацию по каждому запросу, получить данные для этой уникальной строки, затем вернуться к началу и создать новый запрос со следующей строкой. Однако я испытываю затруднения, заставляя его ждать, пока он не завершит и извлечет данные, прежде чем перейти к следующей итерации. Вот что у меня пока есть:

 public void GetDailyCal() {
        for (int i = 0; i < uniqueDates.size(); i++) {
            sum = 0;
            fdb.collection("users").document(username).collection("Diet").whereEqualTo("simpleDate", uniqueDates.get(i))
                    .get()
                    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if (task.isSuccessful()) {
                                for (QueryDocumentSnapshot snapshot : task.getResult()) {
                                    List<Long> TotalCalories = new ArrayList<>();
                                    TotalCalories.add(snapshot.getLong("foodCalories"));
                                    for (int i = 0; i < TotalCalories.size(); i++) {
                                        sum += TotalCalories.get(i);
                                    }
                                }

                            }

                            else {
                                Log.d(TAG, "Error getting documents: ", task.getException());
                            }
                        }

                    });
            //finalCalories.add(Long.valueOf(sum));
            //i++;
        }
    } 

В настоящее время это просто итерирует i ++ до достижения метода uniqueDates.size () и затем начинает запрос вместо выполнения запроса, а затем i ++ после его завершения. Я безуспешно пытался поместить i ++ в разные позиции.

Как именно я могу сделать это, чтобы выполнить первый запрос, используя первый элемент в массиве, завершить поиск данных, а затем i ++, чтобы выполнить следующий запрос?

Спасибо.

1 Ответ

0 голосов
/ 19 марта 2020

Рассматривали ли вы использование оператора in ? Если у вас 10 или меньше дат, вам не понадобится al oop, и ваш запрос будет выглядеть примерно так:

fdb.collection("users").document(username)
   .collection("Diet").whereIn("simpleDate", uniqueDates)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...