如何在Java中计算firebase for Android中特定子事件的数量
我正在制作一个考勤应用程序,我需要计算来自Firebase的特定学生考勤。我需要数一数“prof”出现的次数,我对这一点还不熟悉如何在Java中计算firebase for Android中特定子事件的数量,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在制作一个考勤应用程序,我需要计算来自Firebase的特定学生考勤。我需要数一数“prof”出现的次数,我对这一点还不熟悉 但是结果显示的是null值。如果出现prof,您可以将该子数据添加到列表中。通过这种方式,您可以通过使用list.size()获得孩子的数量,如果您有,还可以在其他操作中使用此数据列表。为了解决此问题,您需要更改数据库结构。无法查询数据库,因为节点是动态生成的。正如@FrankvanPuffelen在他的评论中提到的,给您带来麻烦的节点是:2018年7月4日with
但是结果显示的是
null
值。如果出现prof,您可以将该子数据添加到列表中。通过这种方式,您可以通过使用list.size()
获得孩子的数量,如果您有,还可以在其他操作中使用此数据列表。为了解决此问题,您需要更改数据库结构。无法查询数据库,因为节点是动态生成的。正如@FrankvanPuffelen在他的评论中提到的,给您带来麻烦的节点是:2018年7月4日
withdcbch…
和2018年7月5日
withhello
。由于Firebase只能返回节点每个子节点下固定路径上的结果,为了解决这个问题,我建议您将日期创建为属性就是这样做的,这就是您的数据库结构的外观:
Firebase-root
|
--- dcbch..._dkjh...
|
--- Prof
|
--- email: "profeamil@gmail.com"
|
--- name: "prof"
|
--- present: true
|
--- date: 1530784439 //Current timestamp
下面是相应的查询:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.orderByChild("Prof/name").equalsTo("prof");
现在,您可以附加一个侦听器,并在
DataSnapshot
对象上使用getChildrenCount()
方法来获取出现的次数。计算根引用中的任何字段子级非常简单
例如,您有一个根名称,然后您计算类型为professor的名称
databaseReference = FirebaseDatabase.getInstance().getReference().child("Attendance").child(istrustnumberavailable);
databaseReference.limitToFirst(5);
Query query = databaseReference.orderByChild("name").equalTo("prof");
ChildEventListener removedListener = query.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (dataSnapshot.exists()){
long count= dataSnapshot.getChildrenCount();
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (dataSnapshot.exists()){
long count= dataSnapshot.getChildrenCount();
}
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
long count= dataSnapshot.getChildrenCount();
}
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
哪个
log
显示null
?在您要查询的节点下(考勤
)有两个似乎是动态生成的级别(日期和dcbch…/hello)。Firebase只能返回运行查询的节点的每个子节点下的固定路径上的结果。你看,是的,我按你说的做了,效果很好。谢谢,但是我不想更改数据库结构。不幸的是,没有办法使用数据库结构来实现这一点。如果你认为我的答案对你有帮助,请考虑点击点击箭头左侧的复选标记来接受它。应该把颜色改成绿色。谢谢
databaseReference = FirebaseDatabase.getInstance().getReference().child("Attendance").child(istrustnumberavailable);
databaseReference.limitToFirst(5);
Query query = databaseReference.orderByChild("name").equalTo("prof");
ChildEventListener removedListener = query.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (dataSnapshot.exists()){
long count= dataSnapshot.getChildrenCount();
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (dataSnapshot.exists()){
long count= dataSnapshot.getChildrenCount();
}
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
long count= dataSnapshot.getChildrenCount();
}
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});