Obtenir une FIRDatabaseReference
Pour lire ou écrire des données dans la base de données, vous avez besoin d'une instance de FIRDatabaseReference
:
Swift
var ref: DatabaseReference! ref = Database.database().reference()
Objective-C
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
Lire et écrire des listes
Ajouter des données à une liste
Utilisez la méthode childByAutoId
pour ajouter des données à une liste dans les applications multi-utilisateurs. La méthode childByAutoId
génère une clé unique chaque fois qu'un enfant est ajouté à la référence Firebase spécifiée. En utilisant ces clés générées automatiquement pour chaque nouvel élément de la liste, plusieurs clients peuvent ajouter des enfants au même emplacement en même temps sans conflits d'écriture. La clé unique générée par childByAutoId
est basée sur un code temporel. Les éléments de la liste sont donc automatiquement classés par ordre chronologique.
Vous pouvez utiliser la référence aux nouvelles données renvoyées par la méthode childByAutoId
pour obtenir la valeur de la clé générée automatiquement de l'enfant ou définir des données pour l'enfant.
L'appel de getKey
sur une référence childByAutoId
renvoie la clé générée automatiquement.
Vous pouvez utiliser ces clés générées automatiquement pour simplifier l'aplatissement de votre structure de données. Pour en savoir plus, consultez l'exemple de répartition des données.
Écouter les événements enfants
Les événements enfants sont déclenchés en réponse à des opérations spécifiques qui se produisent sur les enfants d'un nœud à partir d'une opération telle qu'un nouvel enfant ajouté via la méthode childByAutoId
ou un enfant mis à jour via la méthode updateChildValues
.
Type d'événement | Utilisation typique |
---|---|
FIRDataEventTypeChildAdded |
Récupérer des listes d'éléments ou écouter les éléments ajoutés à une liste Cet événement est déclenché une fois pour chaque enfant existant, puis à chaque fois qu'un nouvel enfant est ajouté au chemin d'accès spécifié. L'écouteur reçoit un instantané contenant les données du nouvel enfant. |
FIRDataEventTypeChildChanged |
Écoutez les modifications apportées aux éléments d'une liste. Cet événement est déclenché chaque fois qu'un nœud enfant est modifié. Cela inclut toute modification apportée aux descendants du nœud enfant. L'instantané transmis au gestionnaire d'événements contient les données mises à jour pour l'enfant. |
FIRDataEventTypeChildRemoved |
Écoutez les éléments supprimés d'une liste. Cet événement est déclenché lorsqu'un enfant immédiat est supprimé.L'instantané transmis au bloc de rappel contient les données de l'enfant supprimé. |
FIRDataEventTypeChildMoved |
Écoutez les modifications apportées à l'ordre des éléments d'une liste ordonnée.
Cet événement est déclenché chaque fois qu'une mise à jour entraîne le réordonnancement de l'enfant. Elle est utilisée avec des données triées par queryOrderedByChild
ou queryOrderedByValue .
|
Chacun de ces éléments peut être utile pour écouter les modifications apportées à un nœud spécifique d'une base de données. Par exemple, une application de blog social peut utiliser ces méthodes ensemble pour surveiller l'activité dans les commentaires d'un post, comme indiqué ci-dessous :
Swift
// Listen for new comments in the Firebase database commentsRef.observe(.childAdded, with: { (snapshot) -> Void in self.comments.append(snapshot) self.tableView.insertRows( at: [IndexPath(row: self.comments.count - 1, section: self.kSectionComments)], with: UITableView.RowAnimation.automatic ) }) // Listen for deleted comments in the Firebase database commentsRef.observe(.childRemoved, with: { (snapshot) -> Void in let index = self.indexOfMessage(snapshot) self.comments.remove(at: index) self.tableView.deleteRows( at: [IndexPath(row: index, section: self.kSectionComments)], with: UITableView.RowAnimation.automatic ) })
Objective-C
// Listen for new comments in the Firebase database [_commentsRef observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { [self.comments addObject:snapshot]; [self.tableView insertRowsAtIndexPaths:@[ [NSIndexPath indexPathForRow:self.comments.count - 1 inSection:kSectionComments] ] withRowAnimation:UITableViewRowAnimationAutomatic]; }]; // Listen for deleted comments in the Firebase database [_commentsRef observeEventType:FIRDataEventTypeChildRemoved withBlock:^(FIRDataSnapshot *snapshot) { int index = [self indexOfMessage:snapshot]; [self.comments removeObjectAtIndex:index]; [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:kSectionComments]] withRowAnimation:UITableViewRowAnimationAutomatic]; }];
Écouter les événements de valeur
Bien que l'écoute des événements enfants soit la méthode recommandée pour lire les listes de données, il existe des situations où l'écoute des événements de valeur sur une référence de liste est utile.
L'association d'un observateur FIRDataEventTypeValue
à une liste de données renvoie l'intégralité de la liste de données sous la forme d'un seul DataSnapshot, que vous pouvez ensuite parcourir en boucle pour accéder à chaque enfant.
Même lorsqu'il n'y a qu'une seule correspondance pour la requête, l'instantané reste une liste, mais ne contient qu'un seul élément. Pour accéder à l'élément, vous devez parcourir le résultat :
Swift
_commentsRef.observe(.value) { snapshot in for child in snapshot.children { ... } }
Objective-C
[_commentsRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { // Loop over children NSEnumerator *children = [snapshot children]; FIRDataSnapshot *child; while (child = [children nextObject]) { // ... } }];
Ce modèle peut être utile lorsque vous souhaitez récupérer tous les enfants d'une liste en une seule opération, plutôt que d'écouter les événements d'enfant ajouté supplémentaires.
Trier et filtrer les données
Vous pouvez utiliser la classe Realtime Database FIRDatabaseQuery
pour récupérer des données triées par clé, par valeur ou par la valeur d'un enfant. Vous pouvez également filtrer les résultats triés pour obtenir un nombre spécifique de résultats ou une plage de clés ou de valeurs.
Trier les données
Pour récupérer des données triées, commencez par spécifier l'une des méthodes order-by pour déterminer l'ordre des résultats :
Méthode | Utilisation |
---|---|
queryOrderedByKey
| Triez les résultats par clés enfants. |
queryOrderedByValue |
Triez les résultats par valeurs enfants. |
queryOrderedByChild |
Triez les résultats par la valeur d'une clé enfant ou d'un chemin enfant imbriqué spécifiés. |
Vous ne pouvez utiliser qu'une seule méthode order-by à la fois. L'appel d'une méthode order-by plusieurs fois dans la même requête génère une erreur.
L'exemple suivant montre comment récupérer la liste des posts les plus populaires d'un utilisateur, triés par nombre d'étoiles :
Swift
// My top posts by number of stars let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")
Objective-C
// My top posts by number of stars FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"] child:[super getUid]] queryOrderedByChild:@"starCount"];
Cette requête récupère les posts de l'utilisateur à partir du chemin d'accès dans la base de données en fonction de son ID utilisateur, triés par le nombre d'étoiles que chaque post a reçu. Cette technique d'utilisation des ID comme clés d'index est appelée "expansion des données". Pour en savoir plus, consultez Structurer votre base de données.
L'appel à la méthode queryOrderedByChild
spécifie la clé enfant selon laquelle trier les résultats. Dans cet exemple, les posts sont triés par la valeur de l'enfant "starCount"
dans chaque post. Les requêtes peuvent également être triées par enfants imbriqués, si vous avez des données qui ressemblent à ceci :
"posts": { "ts-functions": { "metrics": { "views" : 1200000, "likes" : 251000, "shares": 1200, }, "title" : "Why you should use TypeScript for writing Cloud Functions", "author": "Doug", }, "android-arch-3": { "metrics": { "views" : 900000, "likes" : 117000, "shares": 144, }, "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)", "author": "Doug", } },
Dans ce cas, nous pouvons ordonner les éléments de notre liste par valeurs imbriquées sous la clé metrics
en spécifiant le chemin d'accès relatif à l'enfant imbriqué dans notre appel queryOrderedByChild
.
Swift
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
Objective-C
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
Pour en savoir plus sur l'ordre des autres types de données, consultez Ordre des données de requête.
Filtrer les données
Pour filtrer les données, vous pouvez combiner l'une des méthodes de limite ou de plage avec une méthode d'ordre lorsque vous créez une requête.
Méthode | Utilisation |
---|---|
queryLimitedToFirst |
Définit le nombre maximal d'éléments à renvoyer depuis le début de la liste ordonnée des résultats. |
queryLimitedToLast |
Définit le nombre maximal d'éléments à renvoyer à partir de la fin de la liste ordonnée des résultats. |
queryStartingAtValue |
Renvoie les éléments supérieurs ou égaux à la clé ou à la valeur spécifiée, selon la méthode de tri choisie. |
queryStartingAfterValue |
Renvoie les éléments supérieurs à la clé ou à la valeur spécifiée, selon la méthode de tri choisie. |
queryEndingAtValue |
Renvoie les éléments dont la clé ou la valeur est inférieure ou égale à celle spécifiée, selon la méthode de tri choisie. |
queryEndingBeforeValue |
Renvoie les éléments dont la clé ou la valeur sont inférieures à celles spécifiées, selon la méthode de tri choisie. |
queryEqualToValue |
Renvoie les éléments égaux à la clé ou à la valeur spécifiées, en fonction de la méthode de tri choisie. |
Contrairement aux méthodes order-by, vous pouvez combiner plusieurs fonctions limit ou range.
Par exemple, vous pouvez combiner les méthodes queryStartingAtValue
et queryEndingAtValue
pour limiter les résultats à une plage de valeurs spécifiée.
Limiter le nombre de résultats
Vous pouvez utiliser les méthodes queryLimitedToFirst
et queryLimitedToLast
pour définir un nombre maximal d'enfants à synchroniser pour un rappel donné. Par exemple, si vous utilisez queryLimitedToFirst
pour définir une limite de 100, vous ne recevez initialement que 100 rappels FIRDataEventTypeChildAdded
au maximum. Si votre base de données Firebase contient moins de 100 éléments, un rappel FIRDataEventTypeChildAdded
est déclenché pour chaque élément.
À mesure que les éléments changent, vous recevez des rappels FIRDataEventTypeChildAdded
pour les éléments qui entrent dans la requête et des rappels FIRDataEventTypeChildRemoved
pour les éléments qui en sortent, de sorte que le nombre total reste à 100.
L'exemple suivant montre comment une application de blog peut récupérer une liste des 100 posts les plus récents de tous les utilisateurs :
Swift
// Last 100 posts, these are automatically the 100 most recent // due to sorting by push() keys let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!
Objective-C
// Last 100 posts, these are automatically the 100 most recent // due to sorting by push() keys FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];
Filtrer par clé ou par valeur
Vous pouvez utiliser queryStartingAtValue
, queryStartingAfterValue
, queryEndingAtValue
, queryEndingBeforeValue
et queryEqualToValue
pour choisir des points de départ, de fin et d'équivalence arbitraires pour les requêtes. Cela peut être utile pour paginer des données ou trouver des éléments enfants ayant une valeur spécifique.
Ordre des données de requête
Cette section explique comment les données sont triées par chacune des méthodes order-by de la classe FIRDatabaseQuery
.
queryOrderedByKey
Lorsque vous utilisez queryOrderedByKey
pour trier vos données, celles-ci sont renvoyées par clé dans l'ordre croissant.
- Les enfants dont la clé peut être analysée comme un entier de 32 bits sont affichés en premier, par ordre croissant.
- Les enfants dont la clé est une valeur de chaîne viennent ensuite, triés par ordre lexicographique croissant.
queryOrderedByValue
Lorsque vous utilisez queryOrderedByValue
, les enfants sont classés par ordre de valeur. Les critères de tri sont les mêmes que dans queryOrderedByChild
, sauf que la valeur du nœud est utilisée à la place de la valeur d'une clé enfant spécifiée.
queryOrderedByChild
Lorsque vous utilisez queryOrderedByChild
, les données contenant la clé enfant spécifiée sont ordonnées comme suit :
- Les enfants dont la valeur
nil
correspond à la clé enfant spécifiée sont affichés en premier. - Viennent ensuite les enfants dont la valeur est
false
pour la clé enfant spécifiée. Si plusieurs enfants ont une valeur defalse
, ils sont triés lexicographiquement par clé. - Viennent ensuite les enfants dont la valeur est
true
pour la clé enfant spécifiée. Si plusieurs enfants ont une valeur detrue
, ils sont triés de façon lexicographique par clé. - Les enfants avec une valeur numérique suivent, triés par ordre croissant. Si plusieurs enfants ont la même valeur numérique pour le nœud enfant spécifié, ils sont triés par clé.
- Les chaînes viennent après les nombres et sont triées par ordre lexicographique croissant. Si plusieurs enfants ont la même valeur pour le nœud enfant spécifié, ils sont triés de façon lexicographique par clé.
- Les objets sont placés en dernier et triés de manière lexicographique par clé, dans l'ordre croissant.
Détacher les écouteurs
Les observateurs ne cessent pas automatiquement de synchroniser les données lorsque vous quittez un ViewController
. Si un observateur n'est pas supprimé correctement, il continue de synchroniser les données avec la mémoire locale et conserve tous les objets capturés dans la fermeture du gestionnaire d'événements, ce qui peut entraîner des fuites de mémoire. Lorsqu'un observateur n'est plus nécessaire, supprimez-le en transmettant le FIRDatabaseHandle
associé à la méthode removeObserverWithHandle
.
Lorsque vous ajoutez un bloc de rappel à une référence, un FIRDatabaseHandle
est renvoyé.
Ces handles peuvent être utilisés pour supprimer le bloc de rappel.
Si plusieurs écouteurs ont été ajoutés à une référence de base de données, chacun d'eux est appelé lorsqu'un événement est déclenché. Pour arrêter la synchronisation des données à cet emplacement, vous devez supprimer tous les observateurs à un emplacement en appelant la méthode removeAllObservers
.
L'appel de removeObserverWithHandle
ou removeAllObservers
sur un écouteur ne supprime pas automatiquement les écouteurs enregistrés sur ses nœuds enfants. Vous devez également garder une trace de ces références ou de ces handles pour les supprimer.