Почему петли datasnapshot вышли из строя? - PullRequest
0 голосов
/ 22 сентября 2019

Я перебираю данные от детей из базы данных Firebase Realtime Нажмите, чтобы просмотреть данные , но по какой-то причине порядок повторения циклов не является логичным для меня.

Это означает, что после проверки кода ниже в журнале должно отображаться:

[XRA, 32-LY-14, 2, 1, 32-LY-15, 3, 2,YRa, 33-LY-77, 4, 3]

, но он показывает:

[XRA, YRa, 32-LY-14, 2, 1, 32-LY-15, 3, 2, 33-LY-77, 4, 3]

Также, если я поставлю Log.d ("TAG", DrawingsList.toString ());после завершения циклов DataSnapshot Arraylist выглядит пустым, как будто к нему ничего не добавлено.

 public void Drawings_71 () {
    DrawingsList.clear();
    FirebaseDatabase.getInstance().getReference().child("Drawings").child("Area 71").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                TAG = ds.getKey();
                DrawingsList.add(TAG);
                FirebaseDatabase.getInstance().getReference().child("Drawings").child("Area 71").child(TAG).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot2) {
                        for (DataSnapshot ds2 : dataSnapshot2.getChildren()) {
                           String TAG2 = ds2.getKey();
                            String Current_Version = ds2.child("Current Version").getValue().toString();
                            String Previous_Version = ds2.child("Previous Version").getValue().toString();
                            DrawingsList.add(TAG2);
                            DrawingsList.add(Current_Version);
                            DrawingsList.add(Previous_Version);
                        }
                        Log.d("TAG", DrawingsList.toString());
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

Ответы [ 2 ]

2 голосов
/ 22 сентября 2019

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

Похоже, вы также можете не знать, что ваши внутренние слушатели здесь не нужны, так как снимок внешнего слушателя фактически содержит все данные в"/ Чертежи / Площадь 71".Если вы просто более тщательно изучите этот dataSnapshot, вам не придется опрашивать каждого из детей в отдельности.

0 голосов
/ 22 сентября 2019

Когда вы присоединяете слушателя к определенной ссылке, клиент Firebase загружает все данные по этой ссылке.Таким образом, ваш слушатель на Drawings/Area 71 уже содержит все данные, которые существуют под этим узлом, включая данные для каждого дочернего узла.На самом деле, я почти уверен, что ds2 и ds являются снимками одних и тех же данных.

Более простой способ получить данные:

FirebaseDatabase.getInstance().getReference().child("Drawings").child("Area 71").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            TAG = ds.getKey();
            DrawingsList.add(TAG);

            String Current_Version = ds.child("Current Version").getValue().toString();
            String Previous_Version = ds.child("Previous Version").getValue().toString();
            DrawingsList.add(TAG2);
            DrawingsList.add(Current_Version);
            DrawingsList.add(Previous_Version);
        }
        System.out.println("Loaded: "+DrawingsList.size())
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...