• 12 hours
  • Hard

Free online content available in this course.

course.header.alt.is_video

course.header.alt.is_certifying

Got it!

Last updated on 3/22/24

Allez plus loin avec Core Data

Core Data est une technologie très puissante et dans ce chapitre, je vais essayer de vous donner un aperçu de quelques-unes de ses autres fonctionnalités.

Utilisez les predicate

Pour l'instant, nous n'avons vu que des requêtes qui permettaient de récupérer seulement tous les objets d'une même entité. On a appris à les ordonner avec NSSortDescriptor. Mais je ne vous ai pas montré comment filtrer les données.

En effet, on n’a pas toujours besoin de tous les objets. Parfois on n'en veut que quelques-uns, choisis selon certains critères. Par exemple, dans notre application, on pourrait ne vouloir afficher que les dépenses d'une seule personne.

Pour faire cela, on utilise ce qu'on appelle les predicateNSFetchRequest  a une propriété predicate  de type NSPredicate, qui s'utilise ainsi :

let request: NSFetchRequest<Spending> = Spending.fetchRequest()
request.predicate = NSPredicate(format: "person.name == %@", "Jean-Pierre")

Les predicates ont une syntaxe très particulière qui se veut la plus proche possible de l'anglais. La nature du filtre est précisée entre les guillemets et lors de l'exécution, le %@  sera remplacé par la valeur indiquée ensuite : "Jean-Pierre".

Voici d'autres exemples de predicate :

// Récupérer les dépenses dont le montant est inférieur à 100
NSPredicate(format: "amount < %@", 100)
// Récupérer les dépenses dont la description contient le mot pizza
NSPredicate(format: "content CONTAINS %@", "pizza")

Vous allez vite voir que vous pouvez faire des tris très puissants en utilisant des predicates.

Implémenter une Table View avec  NSFetchResultController

Deuxième arrêt : NSFetchResultController  !

Core Data est une technologie d'Apple, et donc elle s'intègre très bien avec l'écosystème iOS. Dans cette optique, NSFetchResultController  facilite l'intégration entre Core Data et une Table View.

NSFetchResultController  fonctionne très simplement. Il suffit de lui passer une requête NSFetchRequest  et il va s'occuper de l'exécuter, de récupérer les données et de remplir la Table View.

Et là où c'est vraiment intéressant, c'est que NSFechResultController  peut écouter les modifications qui ont lieu sur la requête : y a-t-il de nouveaux objets ? Certains ont-ils été modifiés/supprimés, etc.? Si c'est le cas, il recharge automatiquement les données en mettant à jour la Table View.

C'est extrêmement pratique !

Ajoutez des méthodes undo / redo

Souvent dans une application, on vous propose d'annuler votre dernière action. C'est le fameux cmd + z sur le Mac.

Avec Core Data, vous pouvez implémenter ce genre de fonctionnalité très simplement grâce au UndoManager.

undoManager  est une propriété de type UndoManager  de NSManagedObjectContext. Cette propriété enregistre toutes les modifications qui ont eu lieu dans le contexte. Via la méthode undo, vous pouvez annuler la dernière modification. Via la méthode redo, vous pouvez rétablir la dernière modification.

Faite la migration

Le dernier arrêt de ces aperçus n'est pas vraiment une fonctionnalité, mais plutôt quelque chose que vous devez absolument savoir sur Core Data avant d'envoyer vos applications à vos utilisateurs.

Imaginons la situation suivante

Vous avez votre superbe application qui utilise Core Data. Vous avez travaillé dessus depuis 6 mois et vous envoyez la version 1.0 de votre application pour la première fois sur l'App Store.

C'est un succès délirant, et vous avez des milliers d'utilisateurs. Forcément, vous ne voulez pas en rester là et vous décidez de rajouter de nouvelles fonctionnalités dans une version 1.1. Ces nouvelles fonctionnalités impliquent des changements dans votre modèle de données Core Data. Vous ajoutez une entité, en supprimez une autre et en modifiez une troisième.

Vous envoyez la mise à jour à tous vos utilisateurs. Ils l'installent tous et l'application plante ! Votre application ne fonctionne plus sur aucun iPhone ! Ils désinstallent tous votre application, vous avez une mauvaise presse, c'est la fin de l'aventure...

Que s'est-il passé ?

Lorsque les utilisateurs ont installé la version 1.0, c'était la première installation, donc la base de données Core Data était vide. Au fur et à mesure de l'utilisation de l'application, ils ont rempli leur base de données selon le modèle de données défini dans la version 1.0.

Ensuite, ils ont installé la version 1.1. Et c'est ici que le problème intervient. La base de données est toujours remplie selon le modèle de données de la version 1.0. Mais le modèle de données a changé ! Donc les nouveaux objets vont être ajoutés selon un modèle différent.

Or une base de données ne sait pas gérer deux modèles différents, donc l'application plante.

Le modèle et la base de donnée ne correspondent plus en V1.1 et donc l'application plante

Découvrez la solution

La solution, c'est la migration. Le principe, c'est qu'on va modifier tous les objets de la base de données pour qu'ils se conforment au nouveau modèle.

Une fois la migration terminée, la base est conforme au nouveau modèle. Et on peut ajouter des objets, la base restera homogène.

Pour creuser ce sujet et voir concrètement comment faire une migration, je vous propose ce tutoriel.

Le cours est dorénavant terminé, je vous laisse prendre le temps de découvrir la conclusion ! 

Example of certificate of achievement
Example of certificate of achievement