onAddChild of ChildEventListener срабатывает для всех существующих узлов, когда я добавляю слушателя - PullRequest
0 голосов
/ 04 марта 2019

Я не могу понять, почему это происходит!

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

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

Я добавляю ChildEventListener примерно так

FirebaseDatabase.getInstance().getReference("roles/roleAdmin").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            // This should be fired only if new data is added to the
            // database under the path roles/roleAdmin,
            // but instead, as soon as the program runs the line to add the
            // ChildEventListener (above), this event starts firing for each
            // one of the already existing nodes under roles/roleAdmin
        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {}

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {}

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {}

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

Данные в узле roles выглядят следующим образом

role: {
    roleAdmin: {
        name: "Admin"
    }
}

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

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

Я не думаю, что это ожидаемое поведение,Я что-то упускаю?

1 Ответ

0 голосов
/ 04 марта 2019

Не думаю, что это ожидаемое поведение.

Да, это так.Если вы используете ChildEventListener, это означает, что ваш метод onChildAdded() вызывается для каждого дочернего узла сразу, а затем позже, когда добавляется новый дочерний узел.Таким образом, в соответствии с количеством имеющихся у вас предметов, onChildAdded() будет вызываться столько же раз, и, к сожалению, это поведение изменить нельзя.

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