Firebase несколько запросов в android - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть эта база данных:

Firebase db

Коллекция кандидатов содержит несколько категорий, таких как президент и секретарь. Он также имеет totalVotes для каждого кандидата. Я хотел бы спросить:

  1. Результаты по категориям, например, Президент или Секретарь
  2. Кандидат с наибольшим количеством голосов в каждой категории, т. Е. Президент с наибольшим количеством голосов и секретарь. с наибольшим количеством голосов.

Вот мой код, который не работает:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference candidatesRef = rootRef.child("candidates");
        Query specific = candidatesRef.orderByChild("category").equalTo("President");

        specific.orderByChild("totalVotes").limitToFirst(1);

        specific.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot){
                for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
                    String firstname = childSnapshot.child("firstname").getValue(String.class);
                    String lastname = childSnapshot.child("lastname").getValue(String.class);
                    Long votes = childSnapshot.child("totalVotes").getValue(Long.class);
                    pres.setText(firstname + " " + lastname+" - "+votes+" Votes");
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException(); // don't swallow errors
            }
        });

Как этого добиться? Спасибо

1 Ответ

1 голос
/ 09 апреля 2020

К сожалению, в Firebase нет предложения OR. Таким образом, вы не можете фильтровать кандидатов по свойству category на основе нескольких значений.

Существует решение, которое может работать, но только , если эти значения находятся в диапазоне. В вашем случае вы можете получить всех кандидатов, соответствующих President или Secretary с:

ref.child("candidates")
   .orderByChild("category")
   .startAt("President")
   .endAt("Secretary")

Проблема здесь в том, что он также будет соответствовать кандидатам для других категорий, чья категория находится между President и Secretary если он существует. Кроме того, вы можете , а не ограничить запрос до 1 или 2, потому что вы никогда не узнаете, какой из кандидатов наберет наибольшее количество голосов. Это может быть как президент, так и секретарь.

Таким образом, в базе данных Firebase Realtime невозможно передать несколько значений в запрос. Для этого вам нужно выполнить отдельные запросы и объединить результат на клиенте.

Если вы когда-нибудь решите попробовать Cloud Firestore , вы можете найти там запрос whereIn (Строковое поле, Список значений) метод, который может помочь вам решить эту проблему.

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