Parcourir une table firebase

Bonjour,
Je suis un peu dérouter car je dois parcourir une base de données firebase car je n’ai pas l’habitude de ce genre de structure.

voici un example :

{
« activities »:{
« activity1 »: {

}
« activity2 »: {

}
etc…
}

Si j’ai compris en il faut que je récupère chaque clé et qu’ensuite je parcours les informations
ou il y a un autre moyen ?
du style mon array[« activity1 »].foreach() …
Si vous avez des examples je suis preneur.

Merci d’avance.

Hello @christophemilliere93,

Dans l’exemple que tu as mis dans ton post, tu peux demander à Firebase de récupérer toutes les informations activities (qui est une collection), en faisant:

let database = FIRFirestoreService.shared.database()
database.collection("activities").getDocuments { snapshot, error in
    if let error = error {
        print(error.localizedDescription)
    } else {
        let activities = snapshot.documents
        // Ici tu as toutes tes activités sous forme de [String: Any]
    }
}

Une fois que tu as récupérés toutes les activités, tu peux en faire ce que tu veux (créer un tableau d’objet par exemple, pour que ce soit plus simple pour travailler avec).

Donc il ne faut pas que tu récupères chaque clés, mais bien la clé « parente » pour ensuite te balader dans ses enfants. Si tu t’amuses à récupérer chaque clé « enfant » indépendamment, ça pourrait fonctionner, mais tu risques de faire beaucoup de lectures vers Firebase pour pas grand chose.

J’espère avoir répondu à ta question :slight_smile:
(Si tu as d’autres questions, n’hésite pas :wink: )

Bonne soirée,

Alexandre

1 J'aime

Hello Christophe,

Ta base de données est sur Realtime Database ou sur Firestore ?
Car la structure d’appel ensuite n’est pas la même.

Merci @Alexandre pour ta réponse, par contre la personne a crée sa base sur Realtime Database je pense que le code avec Firestore ne marchera pas si ?.

@schtipoun oui la base est sur Realtime Database,

J’ai commencé à faire ce genre de code:

var ref = Database().database().reference()
ref.child("activities").oberserveSingleEvent(.value){ (snap) in 
  guard let value = snap.value as? [string: any] else { return }
   // je récupère bien ma collection avec value.
je reçois bien :
"activities":{
    "activity1": {
      …
   }
  "activity2 ": {
  …
  }
}
   
  // et l'idée est de récupère la clé et de refaire un for ou il. y a un autre moyen

juste pour pour ma culture quelle est la différence entre FireStore et Realtime database.

Merci d’avance.

Realmtime Database est l’ancienne version de Firestore il me semble (à confirmer).

Si avec ton code tu arrives à avoir un JSON ([String: Any]), alors tu es au même point que le code que je t’avais présenté au dessus.
Il te reste alors à créer un tableau d’objet « Activity » (par exemple) pour pouvoir en profiter et jouer avec (regarde du coté JSONEncoder/Decoder).

Bonne journée,

Alexandre

Effectivement, ton guard peut te servir par exemple à vérifier que ton snapshot n’est pas nil ou qu’il n’a pas une taille égale à 0. Ensuite, il faut que tu fasses un for à l’intérieur de ton snapshot pour parcourir l’intégralité des données. Aussi, essaye de renommer ton snap en activitiesSnapshot par exemple car tu vas vite voir que les snapshots sont beaucoup utilisés et si tu ne les nommes pas directement dès le début, c’est compliqué ensuite de savoir auquel se référer.

Donc, après tu peux faire quelque chose comme :

for activity in activitiesSnapshot.children {
      let activitySnapshot = activity as! Datasnapshot
      let activityArrayData = acitivitySnapshot.value as? [String:AnyObject]
      ...
}

Ce n’est qu’un exemple car je ne connais pas la complexité de ta base de données ni la granularité que tu as mis ensuite.

@Alexandre , @schtipoun : Merci pour vos réponses .