Boucle sur firestore possible?

Résolu
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024 - 12 déc. 2023 à 18:21
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 5 janv. 2024 à 09:20

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.


6 réponses

CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024
3 janv. 2024 à 15:30

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.


0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
4 janv. 2024 à 09:15

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 ?


0
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024
4 janv. 2024 à 14:04

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

0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
4 janv. 2024 à 15:48

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();
        }
    }

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024
5 janv. 2024 à 00:04

Bonsoir 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


0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
5 janv. 2024 à 09:20

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é.


0