Interroger des données relationnelles avec ParseSwift SDK
Dans le guide précédent nous avons détaillé comment nous pouvons effectuer diverses requêtes sur une base de données Back4App. Dans ce guide, nous nous concentrons sur un type spécifique de requête qui implique des objets avec des relations.
Pour compléter ce tutoriel, vous aurez besoin de :
- Une application iOS de base pour tester les requêtes
Interroger des données relationnelles stockées sur une base de données Back4App en utilisant le ParseSwift SDK.
Toute requête effectuée sur une base de données Back4App se fait via la classe générique Query<U>. Le paramètre générique U (conforme au ParseObject protocole) est le type de données des objets que nous essayons de récupérer de la base de données.
Étant donné un type de données comme MyObject, nous récupérons ces objets d'une base de données Back4App de la manière suivante
Vous pouvez en savoir plus sur la Query<U> classe ici dans la documentation officielle.
Avant de commencer à exécuter des requêtes, il est nécessaire de configurer certaines données sur une base de données Back4App. Nous allons stocker cinq types d'objets:
De plus, afin de construire des requêtes pour des données relationnelles, nous allons mettre en œuvre les relations suivantes
- 1:1 relation entre Livre et ISBD.
- 1:N relation entre Livre et Éditeur.
- M:N relation entre Livre et Auteur.
- M:N relation entre Librairie et Livre.
Nous allons maintenant stocker des données dans la base de données Back4App. Cette étape peut être mise en œuvre en utilisant Swift ou directement depuis la console de votre application sur la plateforme Back4App.
Une fois que la base de données a quelques données d'exemple avec lesquelles travailler, nous commençons à exécuter les différents types de requêtes associées aux relations détaillées précédemment.
Requêtes impliquant des relations 1:1
Étant donné deux types de données partageant une 1:1 relation (Livre et ISBD dans ce cas), nous pouvons récupérer l'un à partir de l'autre comme suit. La façon dont nous avons implémenté la relation dans Livre nous permet de récupérer son ISBD associé simplement en appelant la méthode include(_:) sur la requête. Récupérons le ISBD du livre Une histoire d'amour:
D'autre part, une requête pour récupérer un Livre associé à un ISBD donné est implémentée de la manière suivante. En regardant l'implémentation de ISBD, nous notons que la relation est représentée par la propriété livre (de type Pointer<livre>). Ce pointeur fournit un ensemble de méthodes et de propriétés pour récupérer des informations sur l'objet auquel il pointe. En particulier, nous appelons la méthode fetch(...) sur la propriété livre pour récupérer le Livre
Nous devrions remarquer que cette implémentation pour une 1:1 relation n'est pas unique. Selon votre cas d'utilisation, vous pouvez implémenter des 1:1 relations de différentes manières.
Requêtes impliquant des relations 1:N
Dans un scénario où nous devons interroger tous les livres publiés par un éditeur donné, nous devons d'abord récupérer l'éditeur. Par exemple, nous récupérons d'abord l'objet de données associé à l'éditeur Acacia Publishings. Selon la situation, ce processus peut varier.
Maintenant que nous avons accès à acaciaPublishings, nous pouvons construire la requête pour récupérer ses livres associés. Nous procédons à créer la requête en instanciant une Query<Book> classe. Dans ce cas, cette classe est instanciée en utilisant la méthode statique query(...) fournie par l'objet Book. Les arguments (variadiques) pour cette méthode sont les objets standard QueryConstraint . Par conséquent, les livres que nous recherchons sont récupérés avec le snippet suivant.
Une implémentation asynchrone pour le snippet ci-dessus peut être écrite de la manière suivante
Requêtes impliquant des relations M:N (Cas 1)
Pour illustrer ce cas, nous considérons le scénario suivant ; nous voulons lister tous les magasins contenant des livres publiés après une date donnée (par exemple, 01/01/2010). Tout d'abord, nous avons besoin d'une requête intermédiaire pour sélectionner les livres. Ensuite, nous construisons la requête principale pour lister les magasins.
Par conséquent, nous préparons la première requête pour les livres
Nous construisons ensuite la requête des magasins en utilisant les résultats de booksQuery. La méthode containedIn(_:array:) retourne la contrainte dont nous avons besoin pour ce cas
De même, nous pouvons mettre en œuvre ce processus de manière asynchrone
Requêtes impliquant des relations M:N (Cas 2)
Supposons que nous devons sélectionner tous les magasins qui ont des livres écrits par un auteur donné, disons, Aaron Writer. Pour y parvenir, nous avons besoin de deux requêtes supplémentaires :
- Une requête (Query<Author>) pour obtenir l'objet associé à l'auteur Aaron Writer.
- Une requête (Query<Book>) pour sélectionner tous les livres écrits par Aaron Writer.
- La requête principale (Query<BookStore>) pour sélectionner les magasins que nous recherchons.
La procédure pour mettre en œuvre ces requêtes est très similaire à celles précédentes :
Avec le ParseSwift SDK, nous avons pu construire des requêtes relationnelles qui nous ont permis de sélectionner des éléments en fonction du type de relations qu'ils ont avec d'autres types de données.