Невозможно правильно выполнить итерацию по базе данных Firebase в реальном времени - PullRequest
0 голосов
/ 25 января 2020

Я довольно новичок в android studio и firebase, и у меня возникают проблемы с получением указанного c значения ключа из базы данных реального времени firebase.

Итак, у меня есть массив пользователей в база данных реального времени firebase, и я хочу выполнить итерацию по всему массиву, но я «перемещаю» итератор один раз каждый раз, когда нажимаю кнопку «Далее» до конца массива.

Это не состояние c, то есть размер массива может измениться.

Когда я перемещаю итератор (когда я нажимаю кнопку), я хочу получить сообщение «status» от база данных реального времени firebase для этого пользователя (при первом нажатии кнопки следующий итератор будет равен 1, и я хочу получить сообщение о состоянии для пользователя, ключ которого равен 1 и т. д.).

Извините, что не будет позвольте мне опубликовать изображение

Ссылка на мою базу данных firebase:

Приведенный ниже код работает, но он всегда возвращает значение «status» последнего пользователя, который присоединился к массиву.

Мой код выглядит так:

next.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(current_person < number_of_people_in_the_row){
            current_person++;

            current_person.setText(String.valueOf(current_person));

            final String current_person_string = String.valueOf(current_person );

            DatabaseReference user = db.getReference("Redovi").child("Aktivni").child(pin);
            user.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot current_user: dataSnapshot.getChildren()){
                        current_user.child(current_person_string);

                        for(DataSnapshot current_user_data: current_user.getChildren()){
                            String current_user_status = current_user_data.child("status").getValue().toString();

                            Toast.makeText(RedomatAdmin.this, current_user_status, Toast.LENGTH_SHORT).show();

                        }
                    }
                }

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

                }
            });
        }
    }
});

1 Ответ

0 голосов
/ 25 января 2020

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

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

  1. Показывать только одно сообщение о тосте со всеми данными после выполнения циклов.
  2. Записывать значения для каждого l oop, так что вы можете найти их в выводе logcat.
DatabaseReference user = db.getReference("Redovi").child("Aktivni").child(pin);
user.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String toast = "";
        for(DataSnapshot current_user: dataSnapshot.getChildren()){
            String current_user_key = current_user.getKey();
            Log.d("NEXT", "Handling user "+current_user_key);
            for(DataSnapshot current_user_data: current_user.getChildren()){
                String current_user_status = current_user_data.child("status").getValue().toString();

                Log.d("NEXT", "Handling data "+current_user_data.getKey()+" status="+current_user_status);

                toast = toast + current_user_key + " = " + current_user_status + ", ";
            }
        }
        Toast.makeText(RedomatAdmin.this, toast, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors please
    }
});

Еще лучше научиться использовать интерактивный отладчик в Android Studio, установить точку останова в вашем onDataChange и затем выполнить шаг через код, чтобы увидеть, что происходит в более неторопливом темпе. :)

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