让孩子计算在Firebase中

时间:2017-09-25 13:17:43

标签: java android firebase firebase-realtime-database listener

请问我如何从firebase查询中获取子计数。例如,假设我使用了一个包含10个孩子的数据库查询,我如何获得该值,因为我尝试使用 onChildChanged 并从 snapshot 获取值,但它效果不好。这是因为首先它将获得数字,然后它将再次查询,因为它必须连续同步,但因为在第二个查询中没有实际的子更改它返回一个值,如果为零将替换原始的正确值。 :/

   databaseReference.child("PrinterView").child(uni).child(phone).orderByChild("done").equalTo("No").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Toast.makeText(getActivity(),"Number:"+String.valueOf(dataSnapshot.getChildrenCount()),Toast.LENGTH_LONG).show();

        }

        @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) {

        }
    });

两个人都没有工作

   databaseReference.child("PrinterView").child(uni).child(phone).orderByChild("done").equalTo("No").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Toast.makeText(getActivity(),"Number:"+String.valueOf(dataSnapshot.getChildrenCount()),Toast.LENGTH_LONG).show();
            Vendor_view_Home_fragment.printIndicator.setText(String.valueOf(dataSnapshot.getChildrenCount()));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

假设PrinterView是Firebase根目录的直接子代,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference yourRef = rootRef.child("PrinterView").child("Covenant University").child("588");
Query query = yourRef.orderByChild("done").equalTo("No");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        long count = dataSnapshot.getChildrenCount();
        Log.d("TAG", count);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
query.addListenerForSingleValueEvent(eventListener);

答案 1 :(得分:0)

问题在于这一行:

databaseReference.child("PrinterView").child(uni).child(phone).orderByChild("done").equalTo("No").addValueEventListener(new ValueEventListener() 

变量“uni”和“phone”也由firebase提供了查询EG这是为了获取当前用户的大学和电话号码,所以我不能在那里放一个静态字符串

    databaseReference.child("Users").child(mAuth.getCurrentUser().getUid()).child("Phone").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            phone = dataSnapshot.getValue().toString();
            // Toast.makeText(getActivity(), phone, Toast.LENGTH_LONG).show();
            setPendingList();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

所以问题在于,如果网络连接速度很慢或者查询尚未完成,那么这两个变量将为空,从而使dataSnapshot为空。我将不得不排除这一点,只允许在其余部分确定完成后进行查询。 :)