3 votes

Android - récupérer des objets personnalisés stockés dans un document dans Cloud Firestore

J'utilise Cloud Firestore comme suit :

enter image description here

La collection "events" contient des documents dont le nom est un identifiant unique d'événement. Ces documents contiennent de nombreux objets 'EventComment', chacun représentant un commentaire fait par un utilisateur.

Pour ajouter l'objet 'EventComment' aux documents, j'utilise ce qui suit :

EventComment mcomment = new EventComment();
mcomment.setComment("this is a comment");
Map<String, EventComment> eventMap = new HashMap<>();
eventMap.put(Long.toHexString(Double.doubleToLongBits(Math.random())), mcomment);

    firestore.collection("events").document(event_id)
            .set(eventMap, SetOptions.merge()).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            Toast.makeText(EventCommentsActivity.this, "ya bastud", Toast.LENGTH_SHORT).show();
        }
});

Je crée un HashMap de String et de mon objet 'EventComment', puis de le placer dans le document.

Cependant, lorsque je veux récupérer tous les objets 'EventComment' contenus dans un document donné, je ne peux pas le transformer en un objet EventComment, c'est-à-dire que je ne peux pas le faire :

    DocumentReference docRef = db.collection("events").document("vvG17ZfcLFVna8");
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
        EventComment comment = documentSnapshot.toObject(EventComment.class);
    }
});

De plus, la tentative de convertir le documentSnapshot en un HashMap donne un message "unchecked cast" et tombe finalement à plat. L'idée est d'utiliser les commentaires pour alimenter un RecyclerView.

Je pense que je dois peut-être restructurer la façon dont je stocke les données ?

Toute suggestion serait grandement appréciée.

Cheers

2voto

Alex Mamo Points 44420

Vous devinez juste, vous devez restructurer la façon dont vous stockez les données. Je dis ça parce que la façon dont vous stockez les objets de type EventComment dans votre base de données actuelle n'est pas correcte. Comme vous pouvez le voir dans la documentation officielle concernant Quotas et limites la taille maximale d'un document est de 1MiB . Donc, si vous continuez à stocker les données comme ça, vous allez atteindre la limite de 1MiB en un temps très court.

N'oubliez pas que Cloud Firestore est optimisé pour le stockage de grandes collections de petits documents. Pour résoudre ce problème, je vous recommande de modifier la structure de la base de données comme suit :

Firestore-root
   |
   --- events (collection)
   |     |
   |     --- eventId (document)
   |     |     |
   |     |     --- //event details
   |     |
   |     --- eventId (document)
   |           |
   |           --- //event details
   |
   --- comments (collection)
         |
         --- eventId (document)
               |
               --- eventComments (collection)
                     |
                     --- eventCommentId (document)
                     |      |
                     |      --- //event comment details
                     |
                     --- eventCommentId (document)
                            |
                            --- //event comment details

Comme vous pouvez le voir, chaque obejct de type EventComment est ajouté en tant que document distinct au sein de la events collection. Afin de lire tous les objets d'événements, veuillez utiliser le code suivant :

DocumentReference docRef = db.collection("events");
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
        EventComment comment = documentSnapshot.toObject(EventComment.class);
    }
});

Editar:

Si vous voulez une liste de commnets pour un eventId donné, veuillez regarder à nouveau la structure de la base de données ci-dessus pour voir comment elle peut être représentée. Et comme vous pouvez le voir, j'ai ajouté une nouvelle collection nommée comments dans lequel chaque nouveau commentaire dans un eventId donné est également stocké comme un document séparé. J'ai mis au point cette structure pour éviter les cartes imbriquées.

Si vous êtes intéressé, vous pouvez jeter un coup d'œil à l'une de mes tutoriels dans lequel j'ai expliqué, étape par étape, comment structurer la base de données nécessaire à l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X