Boucle sur firestore possible?
RésoluBunoCS Messages postés 15952 Date d'inscription Statut Modérateur Dernière intervention -
Bonsoir tout le monde,
Je souhaiterais savoir s'il est possible de boucler sur une procedure firestore dans Android Studio ?
Code Firestore
db.collection(collection1.getText().toString())
.document(doc1.getText().toString())
.collection(collection2.getText().toString()).get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
// after getting the data we are calling on success method
// and inside this method we are checking if the received
// query snapshot is empty or not.
if (!queryDocumentSnapshots.isEmpty()) {
// if the snapshot is not empty we are
// hiding our progress bar and adding
// our data in a list.
loadingPB.setVisibility(View.GONE);
List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();
for (DocumentSnapshot d : list) {
// after getting this list we are passing
// that list to our object class.
Usersc = d.toObject(Users.class);
// and we will pass this object class
// inside our arraylist which we have
// created for recycler view.
usersArrayList.add(c);
}
// after adding the data to recycler view.
// we are calling recycler view notifuDataSetChanged
// method to notify that data has been changed in recycler view.
usersAdapter.notifyDataSetChanged();
} else {
// if the snapshot is empty we are displaying a toast message.
showToast("No data found in Database");
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// if we do not get any data or any error we are displaying
// a toast message that we do not get any data
showToast("Fail to get the data.");
}
});
explication rapide, l'utilisateur pourra choisir plusieurs collections2.
En gros:
collection1 = 1 choix
doc1 = 1 choix (pour le moment) j'envisage de permettre plusieurs choix
collection2 = plusieurs possibilités
les intitulés de "collection2" sont des nombres donc l'incrémentation est possible pour le bouclage.
J'obtiens les numéros de la "collection2" via deux textview initialisés en amont (j'aurais également besoin d'un conseil pour utiliser sharedpréférences ou autres à la place des textviews) ce qui me donne un min et un max.
ex:
txtview1 = 2
txtview2 = 7
J'aimerais afficher en 1 seule fois dans mon recyclerview TOUS les docs de chaque "collection2".
Je pensais faire un If... ou Do While mais je ne vois pas comment m'y prendre.
J'espère avoir étais assez compréhensible dans mon explication.
Si vous pouviez me donner une piste de travail ou des supports, je vous en serai reconnaissant.
Au plaisir de vous lire.
- Boucle sur firestore possible?
- Boucle excel sans macro - Forum Excel
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
- Mise à disposition de boucle locale dédiée ✓ - Forum Freebox
- Vlc lire en boucle ✓ - Forum Lecteurs et supports vidéo
- Xiaomi s'éteint tout seul et se rallume en boucle - Forum Xiaomi
6 réponses
Bonjour à toutes et à tous et bonne année,
j'ai tenté un test qui me parait être bon mais toutes les données ne s'affichent pas dans le recyclerView.
private void getUsers() { //loading(true); initIdentifiant(); FirebaseFirestore database = FirebaseFirestore.getInstance(); for (int i = 10; i < 20; i++) { int ym = i; database.collection(Constants.KEY_COLLECTION_X) .document("01") .collection(String.valueOf(ym)) .get() .addOnCompleteListener(task -> { //loading(false); String currentUserId = userId; if (task.isSuccessful() && task.getResult() != null) { List<User> users = new ArrayList<>(); for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } User user = new User(); user.ident = queryDocumentSnapshot.getString(Constants.KEY_1); user.pseudo = queryDocumentSnapshot.getString(Constants.KEY_2); user.email = queryDocumentSnapshot.getString(Constants.KEY_3); user.password = queryDocumentSnapshot.getString(Constants.KEY_4); user.image = queryDocumentSnapshot.getString(Constants.KEY_IMG_5); user.token = queryDocumentSnapshot.getString(Constants.KEY_6); user.id = queryDocumentSnapshot.getId(); users.add(user); showToast("Boucle effectuée sur: " + ym); } if (users.size() > 0) { UsersAdapter usersAdapter = new UsersAdapter(users, this); binding.usersRecyclerView.setAdapter(usersAdapter); binding.usersRecyclerView.setVisibility(View.VISIBLE); } else { //usersAdapter.notifyDataSetChanged(); //showErrorMessage(); } } else { //showErrorMessage(); } }); } }
lorsque je lance le test j'ai une boucle qui se fait sur le bon nombre de documents présents dans Firestore en l'occurrence pour ce test (2)
ex: ym = 12 et ym = 17
Seul le résultat de la première boucle est affiché.
Comment faire pour que TOUS les autres résultats trouvés sur Firestore soient combinés au premier?
J'espère avoir été clair... désolé c'est encore le début de l'année.
Merci par avance.
Hello,
Il y a certaines choses que je ne comprends pas:
- pourquoi boucles-tu entre 10 et 20 ?
- ym n'a pas d'utilité car il a la même valeur que i
- tu as une boucle dans une boucle: pour chaque i, ou ym, tu as une liste de users avec laquelle tu récrées un adapter. Donc à chaque tour de boucle, et si tu as des users, ta RecyclerView se vide.
Est-ce que tu cherches à faire ?
Bonjour Bruno et encore merci de te pencher sur mon problème.
pour répondre à tes questions:
- 10 et 20 sont des exemples, ils seront remplacés par une variable déjà établi dans mon projet,
- pour "ym" je me suis rendu compte de mon ânerie après avoir posté ce message, désolé
- c'est sur ce point précis que je bute.
En fait, à chaque bouclage "ym" je récupère les différents "users" qu'il contient et que je veux charger dans mon recyclerView.
ex:
boucle 1: ym=10 avec 3 users dedans et je les affiche dans le recyclerview.
boucle 2: ym=11 avec 0 users dedans, étant donné que le résultat est nul je passe au bouclage suivant sans supprimer ou vider le recyclerView
boucle 3: ym=12 avec 0 users également, donc idem à boucle 2
boucle 4: ym=13 avec 1 users dedans, j'ajoute donc ce résultat aux bouclages précédents pour pouvoir voir le résultat cumulé de la boucle 1 à celle-ci
boucle 5: ym=14 avec 5 users dedans, je veux pouvoir voir le résultat cumulé de la boucle 1 à celle-ci
et ainsi de suite jusqu'à la borne max (ici 20 pour l'exemple).
J'ai essayé différentes façons de faire mais je n'y arrive pas j'ai toujours le résultat de la boucle 1 uniquement.
Comment dois-je procéder pour initialiser le contenu de mon recyclerView de la manière que j'ai expliqué?
J'espère que mon explication est plus clair.
Merci d'avance
Si ta liste users doit être remplie après chaque itération de ym, il faut que tu la sortes de ta boucle principale. Idem pour la création de ton adapter. Quelque chose dans ce goût là
private void getUsers() { //loading(true); initIdentifiant(); FirebaseFirestore database = FirebaseFirestore.getInstance(); List<User> users = new ArrayList<>(); for (int i = 10; i < 20; i++) { int ym = i; database.collection(Constants.KEY_COLLECTION_X) .document("01") .collection(String.valueOf(ym)) .get() .addOnCompleteListener(task -> { //loading(false); String currentUserId = userId; if (task.isSuccessful() && task.getResult() != null) { for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } User user = new User(); user.ident = queryDocumentSnapshot.getString(Constants.KEY_1); user.pseudo = queryDocumentSnapshot.getString(Constants.KEY_2); user.email = queryDocumentSnapshot.getString(Constants.KEY_3); user.password = queryDocumentSnapshot.getString(Constants.KEY_4); user.image = queryDocumentSnapshot.getString(Constants.KEY_IMG_5); user.token = queryDocumentSnapshot.getString(Constants.KEY_6); user.id = queryDocumentSnapshot.getId(); users.add(user); showToast("Boucle effectuée sur: " + ym); } } else { //showErrorMessage(); } }); } if (users.size() > 0) { UsersAdapter usersAdapter = new UsersAdapter(users, this); binding.usersRecyclerView.setAdapter(usersAdapter); binding.usersRecyclerView.setVisibility(View.VISIBLE); } else { //usersAdapter.notifyDataSetChanged(); //showErrorMessage(); } }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonsoir Bruno,
merci pour ton retour. Aprés quelques modifications j'ai trouvé la solution que j'attendais.
voici ce que j'ai fait :
private void getUsers() { //loading(true); FirebaseFirestore database = FirebaseFirestore.getInstance(); LinearLayoutManager layoutManager = new LinearLayoutManager(this); RecyclerView recyclerView = binding.usersRecyclerView; recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(true); List<User> users = new ArrayList<>(); for (int ym = 10; ym < 20; ym ++) { database.collection(Constants.KEY_COLLECTION_X) .document("01") .collection(String.valueOf(ym)) .get() .addOnCompleteListener(task -> { //loading(false); String currentUserId = userId; if (task.isSuccessful() && task.getResult() != null) { for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } User user = new User(); user.ident = queryDocumentSnapshot.getString(Constants.KEY_1); user.pseudo = queryDocumentSnapshot.getString(Constants.KEY_2); user.email = queryDocumentSnapshot.getString(Constants.KEY_3); user.password = queryDocumentSnapshot.getString(Constants.KEY_4); user.image = queryDocumentSnapshot.getString(Constants.KEY_IMG_5); user.token = queryDocumentSnapshot.getString(Constants.KEY_6); user.id = queryDocumentSnapshot.getId(); users.add(user); showToast("Boucle effectuée sur: " + ym); } if (users.size() > 0) { UsersAdapter usersAdapter = new UsersAdapter(users, this); recyclerView.setAdapter(usersAdapter); recyclerView.setVisibility(View.VISIBLE); } else { //showErrorMessage(); } } else { //showErrorMessage(); } }); } }
Depuis mon code d'origine j'ai déplacé la ligne
"List<User> users = new ArrayList<>();"
juste avant le bouclage.
Merci encore pour tout le temps passé à m'aider.
Peut être à bientôt pour de nouvelles aventures.
Cordialement;
PS: as-tu des connaissances dans les notifications push?
probleme-avec-notification-push-androidstudio
Cool ! Content que tu aies trouvé la solution à ton problème. On peut donc passer ce topic en résolu ?
J'ai déjà intégré des notifications push, oui. Comme dit dans mon message, généralement, le service que tu choisis fournit une doc d'intégration. Mais n'hésites pas à compléter ton problème sur le sujet concerné.