2017-09-25 55 views
1

请如何从火力点查询中简单获取子女数量?例如,假设我使用一个包含10个子项的数据库查询,我如何获取该值,因为我尝试使用onChildChanged并从快照获取值,但效果不佳。这是因为起初它会得到数字,然后它会再次查询,因为它必须连续同步,但是因为在第二个查询中没有实际的子更改,所以它将返回一个值,如果为零,它将替换原始正确的值。 :/在Firebase中获取子女数量

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

+0

请分享一些代码。 –

+0

https://stackoverflow.com/a/37601712/5065318请参考此答案,并让我知道你是否有任何想法。基本上在孩子的内部改变你应该得到孩子的数量。 –

+0

分享我们和你的数据库结构。 –

回答

2

假设PrinterView是你的火力地堡根的直接子,请使用如下代码:

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); 
+0

所以,这段代码的工作原理是因为这是我用来找出问题的方法,它可以工作,但并不能解决问题。我写下了什么解决了下面的问题。谢谢 :)。 –

0

问题是这一行:

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

变量“UNI”和“手机”也由一个火力点查询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空。我将不得不通过只有在其他人确定完成时才被查询的方法来对此进行排序。 :)