Android Firebase数据库获取特定级别的子项

Android Firebase数据库获取特定级别的子项,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我在Firebase中有以下数据库结构: 当我启动活动时,在我的应用程序中。我想在活动启动时只获取一次所有level0Node的节点。我实现的目标如下: rootNode.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Iterable&l

我在Firebase中有以下数据库结构:

当我启动活动时,在我的应用程序中。我想在活动启动时只获取一次所有
level0Node
的节点。我实现的目标如下:

rootNode.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Iterable<DataSnapshot> level0Nodes = dataSnapshot.getChildren();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        });
rootNode.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Iterable<DataSnapshot> level0Nodes = dataSnapshot.getChildren();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
rootNode.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Iterable level0Nodes=dataSnapshot.getChildren();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){}
});

但我面临的问题是,如果
level1Node
上发生任何更新,则会再次调用
onDataChanged
,这是我不希望看到的。如何实现这一点?

您正在寻找一个
SingleValueListener

将您的
ValueEventListener
替换为一个,代码如下所示:

rootNode.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Iterable<DataSnapshot> level0Nodes = dataSnapshot.getChildren();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        });
rootNode.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Iterable<DataSnapshot> level0Nodes = dataSnapshot.getChildren();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
rootNode.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Iterable level0Nodes=dataSnapshot.getChildren();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){}
});

有关更多信息,请参阅

您有两种方法可以一次性从特定参考中获取总数据

  • rootNode.addValueEventListener(新的ValueEventListener(){}

    //您正在使用它,并且根据文档,当此节点(rootNode)上的数据发生更改时,会触发此操作。如果您只想使用它一次,可以通过调用

  • 用于删除进一步更新的rootNode.removeEventListener()方法

  • 使用rootNode.addListenerForSingleValueEvent(新值EventListener(){}
  • 根据文档,这只会触发一次,因此当您的孩子发生变化时,此列表不会触发,您的问题将得到解决

    另外,我只是想建议您阅读firebase的完整文档,因为您的问题非常基本