2017-09-25 83 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空。我將不得不通過只有在其他人確定完成時才被查詢的方法來對此進行排序。 :)