当我添加侦听器时,ChildEventListener的onAddChild将为所有现有节点触发

时间:2019-03-04 07:30:57

标签: java android firebase firebase-realtime-database

我不明白为什么会这样!

我试图添加一个侦听器,以检测何时“新”数据已添加到数据库中。问题在于,一旦我添加了侦听器,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"
    }
}

这直接位于根目录btw之下。在该节点下有更多数据,但是我观察到即使只有很少的数据也会出现相同的问题。

正如我所说,这似乎是在某些已经存在的节点上发生的。当我尝试在相同级别创建一个新节点并为其提供相同的确切内容以查看其是否具有相同效果时,新节点可以正常工作。

我不认为这是预期的行为。有什么我想念的吗?

1 个答案:

答案 0 :(得分:1)

  

我不认为这是预期的行为。

是的。如果您使用的是ChildEventListener,则意味着您的onChildAdded()方法将立即为每个子节点调用,然后在添加新的子节点时调用。因此,根据您拥有的项目数,onChildAdded()将被调用相同的次数,不幸的是,这种行为无法更改。