我的问题是如何在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) {
}
});
答案 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并执行处理逻辑。