【问题标题】:How to count children in addChildEventListener?如何计算 addChildEventListener 中的孩子?
【发布时间】:2018-02-09 19:08:25
【问题描述】:

我的问题是如何计算 addChildEventListener 中的子节点?下面的代码适用于 addValueEventListener 并且它正确计算了我的孩子,但是当我使用 addChildEventListener 时。它不起作用。我之所以使用这个,是因为这个线程:Firebase Android count children/ badge。我试过了,但它在我的代码中不起作用。

在这张图片中,借来的书应该算为 2,但它又回到了 10:

这张图片显示了我在 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) {

        }
    });

【问题讨论】:

  • 这是因为onChildAdded 方法中返回的DataSnapshot 包含最近添加的子项。有什么具体原因需要使用ChildEventListener 而不是ValueEventListener
  • 每次打开活动时,检索数据时都会出现延迟。
  • 延迟与网络状况有关。使用 ChildEventListener 时可能会发生同样的延迟,所以我认为您不必为此烦恼。我建议使用 Single ValueEventListener

标签: android database firebase firebase-realtime-database


【解决方案1】:

在您选择的参考中找到的每个孩子都会触发一次子侦听器,并且随着时间的推移会随着子代的添加、更改和删除而持续触发。仅当从引用中删除侦听器时,它才会停止触发这些事件。它不是像单值事件监听器那样的一次性查询。

如果您想在单个查询中了解某个位置的子项数量,请在参考上addListenerForSingleValueEvent()。这将产生一个 DataSnapshot,您可以对其子项进行迭代和计数。

【讨论】:

    【解决方案2】:

    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ário Pereira Fernandes 所建议的,ValueEventListener 有什么问题? 如果要单独处理每本书,添加一个实例变量,每次调用 onChildAdded 时,将该变量加 1 并做处理逻辑。

    【讨论】:

      猜你喜欢
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多