J'ai cette base de données firebase
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
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.
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*/
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());
}
});