Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中计算firebase for Android中特定子事件的数量_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

如何在Java中计算firebase for Android中特定子事件的数量

如何在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

我正在制作一个考勤应用程序,我需要计算来自Firebase的特定学生考勤。我需要数一数“prof”出现的次数,我对这一点还不熟悉


但是结果显示的是
null
值。

如果出现prof,您可以将该子数据添加到列表中。通过这种方式,您可以通过使用
list.size()
获得孩子的数量,如果您有,还可以在其他操作中使用此数据列表。

为了解决此问题,您需要更改数据库结构。无法查询数据库,因为节点是动态生成的。正如@FrankvanPuffelen在他的评论中提到的,给您带来麻烦的节点是:
2018年7月4日
with
dcbch…
2018年7月5日
with
hello
。由于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) {

        }
    });