2017-09-25 2 views
1

Comment faire pour que l'enfant compte simplement à partir d'une requête Firebase? Par exemple, disons que j'utilise une requête de base de données avec 10 enfants, comment puis-je obtenir cette valeur car j'ai essayé d'utiliser onChildChanged et d'obtenir la valeur de snapshot, mais cela ne fonctionne pas bien. C'est parce qu'au début il aura le numéro, puis il demandera à nouveau parce qu'il doit continuellement se synchroniser, mais parce qu'il n'y a pas de changement d'enfant réel à la deuxième requête il retournera une valeur si zéro qui remplacera la valeur correcte originale. :/Obtention du nombre d'enfants dans 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) { 

     } 
    }); 

Les deux ne fonctionnent pas

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

Veuillez partager du code. –

+0

https://stackoverflow.com/a/37601712/5065318 S'il vous plaît se référer à cette réponse et laissez-moi savoir si vous avez des idées. Fondamentalement à l'intérieur de l'enfant a changé, vous devriez obtenir l'enfant compte. –

+0

Partagez-nous et votre structure de base de données. –

Répondre

2

En supposant que PrinterView est un enfant direct de votre racine Firebase, s'il vous plaît utilisez le code suivant:

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

Donc, ce code fonctionne parce que c'est ce que j'ai utilisé pour trouver le problème, cela fonctionne, mais ne résout pas le problème. J'ai écrit ce qui résout le problème ci-dessous. Merci :). –

0

Le problème était cette ligne:

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

La variable « uni » et « téléphone » a également été fourni par un EG firebase de requête Il était d'obtenir le numéro de l'Université et le téléphone de l'utilisateur actuel donc je ne pouvait pas simplement mettre une chaîne statique là.

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

     } 
    }); 

Donc, la question est que, si la connexion réseau est lente ou si les requêtes ne sont pas encore fait, ces deux variables serait vide ce qui rend le dataSnapshot vide. Je vais devoir régler cela en ne permettant que d'être interrogé quand les autres seront sûrs de l'être. :)