2017-10-17 2 views
0

enter image description hererécupérer des données à partir de la base de données firebase avec certains noeuds étant nulles

cBankRef=myRef.child("user_id").child("ASSETS"); 


cBankRef.addChildEventListener(new ChildEventListener() { 
        @Override 
        public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

         String value = dataSnapshot.child("1").child("description").getValue(String.class); 
         Log.d(TAG, "onChildAdded: the value is"+value); 


         if(dataSnapshot.child("2").exists()) { 
          String valuess = dataSnapshot.child("3").child("description").getValue(String.class); 
          Log.d(TAG, "onChildAdded: the value is: " + valuess); 

         } 
         if (dataSnapshot.child("3").exists()) { 
          String values = dataSnapshot.child("1").child("description").getValue(String.class); 
          Log.d(TAG, "onChildAdded: the cash at bank is: "+values); 
         } 

         } 



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

        } 
       }); 

premier i accessible l'enfant user_id et l'actif puis à travers les noeuds (« 1 »), (« 2 ») i dû ajouter d'autres noeuds pour obtenir la valeur, le ("1") et ("2") étaient ("Cash at Bank") ("stock") au début mais j'ai décidé de les changer en nombre mais cela donne null @makrand Pawar

Répondre

0

Vous avez plusieurs questions dans votre exemple:

  • Votre cBankRef pointe vers \user_id\ASSETS\Cash at bank\stock\Cash in Hand, qui n'existe pas (le noeud Cash at bank n'existe pas sous ASSETS).
  • Vous associez alors un ChildEventListener à cette référence, ce qui ne retournera aucune valeur, car il n'y a pas d'enfants en dessous (car il n'existe pas).
  • À l'intérieur onChildAdded(), vous essayez d'accéder au nœud houses qui n'existe pas dans votre exemple (house fait cependant).

Pour accéder aux enfants sous le nœud Stock, vous aurez besoin de quelque chose comme:

ref = FirebaseDatabase.getInstance().getReference().child("user_id").child("ASSETS").child("Stock"); 

ref.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     String value = dataSnapshot.child("house").child("values").getValue(String.class); 
     Log.d(TAG, "onChildAdded: the value is: "+value); 
    } 
    // ... 
}); 

La méthode est DatabaseReference#child()pas une déclaration SELECT. Pour accéder à tout ce qui se trouve sous un nœud, il vous suffit de créer une référence au nœud le plus haut requis, puis d'y attacher un écouteur.

Par exemple, si vous avez besoin d'accéder à tout sous le nœud ASSETS, vous pouvez joindre un auditeur il à la place:

ref = FirebaseDatabase.getInstance().getReference().child("user_id").child("ASSETS"); 

ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     String value = dataSnapshot.child("Stock").child("house").child("values").getValue(String.class); 
     Log.d(TAG, "onChildAdded: the value is: "+value); 

     if (dataSnapshot.child("Cash at bank").exists()) { 
      String value = dataSnapshot.child("Cash at bank").getValue(String.class); 
      Log.d(TAG, "onChildAdded: the cash at bank is: "+value); 
     } 
    } 
    // ... 
}); 

Puis, quand l'auditeur retourne, vous pouvez utiliser DataSnapshot#child() au lieu d'accéder aux valeurs individuelles récupérées à partir cet endroit. En outre, l'utilisation de DataSnapshot#exists() est un moyen simple de vérifier qu'un noeud existe avant de l'utiliser.

Si vous envisagez d'avoir des valeurs supplémentaires ou des nœuds sous ASSETS qui n'existent pas actuellement, ils seront renvoyés par le programme d'écoute ci-dessus dès leur création.

+0

mais si j'avais un autre noeud Avoirs en banque et un autre argent dans la main à l'actif serait-je utiliser: cBankRef = myRef.child (» user_id "). child (" ACTIFS "). enfant (" Encaisse ") .child (" stock ") .child (" Encaisse "); pour obtenir tous les nœuds en même temps sans créer plusieurs références, puis utilisez addChildEventListener comme vous me l'avez montré (ci-dessus); @Grimthorr –

+0

mais si j'avais un autre nœud Cash à la banque et un autre Cash In Hand sous ACTIF j'utiliserais: cBankRef = myRef.child ("user_id"). Child ("ACTIF"). Child ("Cash à la banque") .child ("stock") .child ("Encaisse"); pour obtenir tous les nœuds en même temps sans créer plusieurs références, puis utilisez l'addChildEventListener comme vous me l'avez montré (ci-dessus); @Alex Mamo –

+0

La méthode [DatabaseReference # child()] (https://firebase.google.com/docs/reference/android/com/google/firebase/database/DatabaseReference#child (java.lang.String)) est ** pas ** une instruction SELECT.Pour accéder à tout ce qui se trouve sous un nœud, il vous suffit de créer une référence au nœud le plus haut requis, puis d'y attacher un écouteur. J'ai mis à jour ma réponse pour inclure cette clarification et un autre exemple. – Grimthorr

0

Pour ce faire, je vous suggère l'utilisation ValueEventListener comme ceci:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference stockRef = rootRef.child("user_id").child("ASSETS").child("Stock"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for(DataSnapshot ds : dataSnapshot.getChildren()) { 
      String values = ds.child("house").child("values").getValue(String.class); 
      Log.d("TAG", values); 
     } 
    } 

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