Как перебрать детей Firebase и добавить их ключи в список? - PullRequest
0 голосов
/ 31 декабря 2018

Итак, у меня есть база данных Firebase в реальном времени, в которой есть ребенок, с детьми под ним.Я хочу пройтись по дочернему элементу и добавить ключи дочерних элементов в список.

Вот что я делаю:

public ArrayList<String> debateKeys() {
    debatesChildren.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
                tempItems.add(postSnapshot.getKey());
            }
        }

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

        }
    });
    return tempItems;
}

Когда я использую отладчик, он показывает, чтоtempItems ничего не возвращает, а onDataChange даже не выполняется, что означает, что он даже не запускает цикл for.

Как просмотреть дочерние элементы ребенка и добавить их ключи в список?

1 Ответ

0 голосов
/ 31 декабря 2018

addValueEventListener () является асинхронным и возвращается немедленно.Прослушиватель, которого вы передали ему, будет вызван через некоторое время, когда результаты станут известны.Это означает, что вы возвращаете изначально пустой templates.Тот, кто держится за templates, может удивиться, если и когда содержимое обновится в непредсказуемое время после возврата вашей функции.Мало того, что содержимое будет продолжать меняться со временем, так как ваш слушатель будет вызываться с каждое изменение в местоположение, представленное debatesChildren.Это действительно ужасная ситуация.

Прежде всего, если вам нужен доступ к данным только один раз, вы должны использовать addListenerForSingleValueEvent () , чтобы ваш слушатель вызывался только один раз.

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

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