如何在firebase android中获取具有特定值的子项数?

时间:2017-03-03 13:34:40

标签: android firebase firebase-realtime-database

My Database Screenshot

我想获得状态为NOT OK的所有化合物的值,您可以在我上传的图片中看到。我试过这个,但我没有得到价值。请帮我创建我想要实现的正确查询。

mUserCompounds.orderByChild("status").equalTo("NOT OK").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            long compounds_solved = dataSnapshot.getChildrenCount();
            String output = String.valueOf(compounds_solved);
            Log.d("OUTPUT", "Total not ok " + output);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            long compounds_solved = dataSnapshot.getChildrenCount();
            String output = String.valueOf(compounds_solved);
            Log.d("OUTPUT", "Total not ok " + output);
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

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

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我想为compound_solved获得的是4.但是根据我的代码得到的是这个。

Output Screenshot here

2 个答案:

答案 0 :(得分:2)

ChildEventListener将为您提供发生事件的子项的数据。因此,当您获得快照上的子项数量时,您实际上获得了属性数量的计数。图像,名称和状态(3)。

改为使用ValueEventListener。

mUserCompounds.orderByChild("status").equalTo("NOT OK").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        System.out.println(dataSnapshot.getChildrenCount());                        }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

答案 1 :(得分:1)

根据我的理解,您想知道您拥有多少种具有“不好”状态的化合物。您没有看到4的原因是因为datasnapshot.getChildrenCount引用了传递查询的每个数据快照。氨,氧化钙,一氧化碳,二氢都逐一进入onChild。数据快照是这些结果中的每一个。你每次看到3的原因是因为每个化合物都有3个属性。图像,名称和状态。这就是为什么每次调用datasnapshot.getChildrenCount()时都会看到3。

Firebase目前无法计算''来自查询的结果。你可以通过两种方式实现自己想要的目标。

  1. 改为创建一个事件值事件侦听器,它可以是单个也可以不是。没关系

    mUserCompounds.orderByChild("status").equalTo("Not ok").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.v("result", String.valueOf(dataSnapshot.getChildrenCount()));
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
    
        }
    });
    
  2. 这将允许你计算"有多少化合物状态好或不好

    1. 让您的数据库的另一部分跟踪有多少化合物状态为“不正常”并且状态为“正常”。它可能看起来像这样。
    2. |----status
                      |------ok : 5
                      |------notok:10
      
      
      

      您可以查询数据库的这一部分。每次化合物的状态发生变化时,都会更新数据库的这一部分(递增和递减计数器)。当你想知道有多少化合物具有正常状态时,你可以引用root.child(" status")。child(" Not ok")并添加一个值事件监听器