web-dev-qa-db-fra.com

Comment obtenir toutes les données de l'enfant dans la base de données firebase?

J'ai cette base de données firebase

enter image description here

et je dois obtenir tous les numéros de téléphone des utilisateurs, quel auditeur dois-je utiliser pour obtenir tous les enfants?

Chaque utilisateur est ajouté en tant qu'objet avec l'ID utilisateur en tant que nom de cet objet. Je dois extraire cet objet sans connaître cet ID utilisateur.

J'ai cherché dans la documentation, elle est liée à DataSnapshot mais je n'ai pas pu obtenir de DataSnapshot sans auditeur! est-il correct de rechercher un DataSnapshout ou dois-je utiliser autre chose

32
mxml

Commencez par récupérer le datasnapshot de vos utilisateurs.

//Get datasnapshot at your "users" root node
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users");
    ref.addListenerForSingleValueEvent(
            new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    //Get map of users in datasnapshot
                    collectPhoneNumbers((Map<String,Object>) dataSnapshot.getValue());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    //handle databaseError
                }
            });

Parcourez ensuite les utilisateurs, accédez à leur carte et collectez le champ téléphonique.

private void collectPhoneNumbers(Map<String,Object> users) {

    ArrayList<Long> phoneNumbers = new ArrayList<>();

    //iterate through each user, ignoring their UID
    for (Map.Entry<String, Object> entry : users.entrySet()){

        //Get user map
        Map singleUser = (Map) entry.getValue();
        //Get phone field and append to list
        phoneNumbers.add((Long) singleUser.get("phone"));
    }

    System.out.println(phoneNumbers.toString());
}

Cet écouteur ne récupérera le datasnapshot que lorsqu'il est explicitement appelé. Pensez à stocker une liste de numéros sous un nœud "allPhoneNumbers" en plus du nœud utilisateurs. Cela rendra vos données instantanées plus légères et plus faciles à traiter lors de la collecte de tous les nombres. Si vous avez dit des centaines d'utilisateurs, le datasnapshot "utilisateurs" sera beaucoup trop grand et la liste "allPhoneNumbers" sera bien plus efficace.

Le code ci-dessus a été testé sur votre base de données exemple et fonctionne. Toutefois, il peut être nécessaire de convertir le champ de votre téléphone en chaîne ou en int, en fonction du type de champ de l'instance de téléphone de l'utilisateur.

41
TempDev
      DatabaseReference ref1= FirebaseDatabase.getInstance().getReference();
      DatabaseReference ref2,ref3,ref4;    
       ref2 = ref1.child("User");


       ref2.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            Userlist = new ArrayList<String>();                
            // Result will be holded Here
            for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                  Userlist.add(String.valueOf(dsp.geValue())); //add result into array list

                }
    /* userlist will store all values of users, then point to every userlist item 
    and get mobile numbers*/
12
Narender Reddy

Vous voudrez peut-être essayer ceci:

Firebase ref = new Firebase(FIREBASE_URL);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
  Log.e("Count " ,""+snapshot.getChildrenCount());
  for (DataSnapshot postSnapshot: snapshot.getChildren()) {
    <YourClass> post = postSnapshot.getValue(<YourClass>.class);
    Log.e("Get Data", post.<YourMethod>());
  }
}
@Override
public void onCancelled(FirebaseError firebaseError) {
  Log.e("The read failed: " ,firebaseError.getMessage());
}
});
1
Gaurang Kanani