如何在addChildEventListener中计算子项?

时间:2018-02-09 19:08:25

标签: android database firebase firebase-realtime-database

我的问题是如何在addChildEventListener中计算子节点?下面的代码适用于addValueEventListener,它正确计算我的孩子,但是当我使用addChildEventListener时。它不起作用。我使用它的原因是因为这个帖子:Firebase Android count children/ badge。我尝试了这个,但它在我的代码中不会以某种方式工作。

在这张图片中,借来的书应该算作2,但它会回到10: Wrong counting in borrowed book portion

此图显示我在firebase中的数据库:Database of Firebase。之所以返回10,是因为它计算了user.getUid()子项的子项。我想要的只是user.getUid()

的孩子

这是我的代码的一部分:

databaseReference.child("Mark as Borrowed").child(uid).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                String number = dataSnapshot.getChildrenCount()+"";
                btnNumber.setText(number);

        }

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

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

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

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

2 个答案:

答案 0 :(得分:1)

对于在您选择的参考中找到的每个孩子,会触发一次子侦听器,并随着孩子的添加,更改和删除而不断地触发。只有在从引用中删除侦听器时,它才会停止触发这些事件。它不是像单个值事件监听器那样的一次性查询。

如果您想知道单个查询中某个位置的子项数,请参考addListenerForSingleValueEvent()。这将生成一个DataSnapshot,其子项可以迭代和计数。

答案 1 :(得分:0)

databaseReference.child("Mark as Borrowed").addChildEventListener(new ChildEventListener // then check the uid of the value from snapshot to match your desired uid before update the TextView。 这应该可以解决问题,但效率非常低,因为它也会读取其他用户。正如RosárioPereiraFernandes所说,ValueEventListener出了什么问题? 如果你想分别处理每本书,添加一个实例变量,每次调用onChildAdded时,将该变量增加1并执行处理逻辑。