Фильтровать снимок результатов в Firebase - PullRequest
0 голосов
/ 09 апреля 2020

Вот моя база данных:

Firebase database

Для каждой категории предполагается вернуть кандидата с наибольшим количеством голосов.

Вот мой код:

Query presidentquery = reference.child("candidates").orderByChild("category").equalTo("President");
        presidentquery.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                        String firstname = dataSnapshot1.child("firstname").getValue(String.class);
                        String lastname = dataSnapshot1.child("lastname").getValue(String.class);
                        Long tvotes = dataSnapshot1.child("totalVotes").getValue(Long.class);
                        pres.setText(firstname + " " + lastname+" - "+tvotes+" Votes");
                    }
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });

Вместо того, чтобы вернуть кандидата с наибольшим количеством голосов, он возвращает самого последнего кандидата. Как я могу отфильтровать результаты в datasnapshot, чтобы отобразить кандидата с наибольшим количеством голосов.

Спасибо

1 Ответ

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

Я повторил вашу проблему и нашел способ получить кандидата с наибольшим количеством голосов.

Добавьте приведенный ниже метод в свой класс модели.

@Override
    public int compareTo(Candidate o) {
        return (this.getTotalVotes() > o.getTotalVotes() ? -1 :
                (this.getTotalVotes() == o.getTotalVotes() ? 0 : 1));
    }

Чтобы переопределить метод compareTo, вам нужно реализовать класс Comparable с помощью implements Comparable<Candidate>

Создать класс для сортировки значений

public class Sorter {

    ArrayList<Candidate> candidateList = new ArrayList<>();
    public Sorter(ArrayList<Candidate> candidateList) {
        this.candidateList = candidateList;
    }
    public ArrayList<Candidate> sortByTotalVotes() {
        Collections.sort(candidateList);
        return candidateList;
    }

}

В вашем классе Activity добавьте

Здесь вам нужно добавить все данные, извлеченные из базы данных, в список массивов. После добавления всех данных вам необходимо отсортировать данные и отобразить результат.

Query query = databaseReference.child("candidates").orderByChild("category").equalTo("President");
query.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            ArrayList<Candidate> candidates = new ArrayList<>();
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                 int id = dataSnapshot1.child("totalVotes").getValue(Integer.class);
                 String firstName = dataSnapshot1.child("firstName").getValue(String.class);
                 String lastName = dataSnapshot1.child("lastName").getValue(String.class);
                 candidate = new Candidate(firstName, lastName, id);
                 candidates.add(candidate);
             }
             Sorter sorter = new Sorter(candidates);
             ArrayList<Candidate> candidateArrayList = sorter.sortByTotalVotes();
             System.out.println("Max value: " + candidateArrayList.get(0));                            
             System.out.println("Printing the sorted values----------------");
             for (Candidate candidate : candidateArrayList) {    
                  System.out.println(candidate);
             }   
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

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