Core Data est le cadre principal d'Apple pour gérer le graphique objet persistant dans les applications iOS. Plutôt que de forcer les développeurs à écrire du SQL brut ou gérer la sérialisation de fichiers, Core Data fournit une interface orientée objet de haut niveau qui traite les complexités du stockage, du suivi des changements et de la modélisation des données. Chaque développeur iOS travaillant avec des données locales doit comprendre les capacités de Core Data et les meilleures pratiques pour construire des applications réactives et riches en données sans sacrifier les performances.

Comprendre l'architecture des données de base

Les données de base ne sont pas simplement une base de données. C'est un cadre de gestion des graphiques objets qui peut persister les données sur disque, mais il gère également les relations d'objets en mémoire, la gestion des opérations et la validation. L'architecture tourne autour de quatre composants clés qui travaillent ensemble pour former ce qui est communément appelé la pile de données .

La pile de données de base

Chaque implémentation de Core Data nécessite un ensemble spécifique d'objets liés dans un ordre défini. La pile se compose de:

  • Contexte d'objet géré (NSManagedObjectContext):[ Le scratchpad où les développeurs travaillent avec des objets gérés. Tous les changements se produisent dans un contexte avant d'être sauvegardés dans le magasin persistant.
  • Coordonnateur permanent du magasin (CRS) : agit comme un pont entre le contexte et le ou les magasins persistants. Il sert de médiateur pour l'accès et assure l'intégrité des données.
  • Managed Object Model (NSManagedObjectModel): Décrit les entités, attributs et relations dans le schéma de données. Il est généralement défini visuellement dans le fichier .xcdatamodeld.
  • Store permanent:[ Le mécanisme de stockage réel, qui peut être SQLite, binaire ou in-memory. SQLite est la valeur par défaut pour les applications de production.

Le développement moderne d'iOS utilise souvent la classe , qui crée et configure automatiquement la pile entière. Cela supprime la plaque de chaudière et réduit les risques de mauvaise configuration.

Configuration des données de base dans votre projet

L'ajout de données de base à un projet iOS nécessite plusieurs étapes délibérées, chacune d'entre elles constituant la base de la gestion des données. Le processus commence par créer un fichier de modèle de données, puis définir vos entités, et enfin intégrer la pile au cycle de vie de votre application.

Création du modèle de données

Commencez par ajouter un nouveau fichier à votre projet Xcode en utilisant le modèle de modèle de données (extension .xcdatamodeld). Dans cet éditeur visuel, vous définissez des entités (équivalentes à des tableaux), leurs attributs (colonnes) et leurs relations avec d'autres entités. Vous pouvez également spécifier des types de données, des valeurs par défaut, des règles de validation et des options d'indexation pour optimiser les performances de la requête.

Définition des entités et relations

Chaque entité représente un type d'objet géré par votre application, comme un utilisateur, une tâche ou un produit. Les attributs définissent les caractéristiques de cette entité (nom, prix, date, etc.). Les relations relient les entités, permettant aux données de base de suivre les graphiques d'objets et de propager automatiquement les suppressions ou mises à jour. Par exemple, une entité « personne » peut avoir une relation unique avec les entités « téléphoneNumber », que les données de base peuvent récupérer dans les deux sens.

Lors de la conception des relations, attention à la règle delete. Les options incluent Nullify, Cascade, et Deny. Choisir la mauvaise règle peut conduire à une perte de données inattendue ou des enregistrements orphelins. Cascade est souvent approprié pour les relations parents-enfants, tandis que Nullify fonctionne bien pour les associations optionnelles.

Générer des sous-classes d'objets gérés par NS

Une fois votre modèle d'entité terminé, Xcode peut générer automatiquement des classes Swift pour chaque entité. Ces sous-classes héritent de et incluent les propriétés et les relations que vous avez définies. À partir de Xcode 8, l'approche recommandée est de sélectionner «Codegen» comme Définition de classe[ (par défaut), qui conserve les fichiers générés dans le dossier de données dérivé.

Exécution des opérations du CRUD

Avec la pile en place, vous pouvez insérer, récupérer, mettre à jour et supprimer des objets gérés en utilisant un . Toutes les opérations doivent être effectuées dans le contexte, et les changements ne sont persistants qu'après un appel réussi .

Création et sauvegarde d'objets

Pour insérer un nouvel objet, utilisez puis définissez ses propriétés. Après toutes les modifications, appelez . Toujours enveloppez les appels de sauvegarde dans un bloc pour gérer les erreurs gracieusement, en particulier lors des actions initiées par l'utilisateur.

Récupération de données avec les prédicats et tri des descripteurs

est le mécanisme principal pour la requête d'objets. Vous pouvez restreindre les résultats en utilisant (p. ex., ) et les résultats de commande avec . Core Data supporte également les prédicats composés, les sous-requêtes et les relations de récupération avidement.

Mise à jour et suppression

Mettre à jour un objet est aussi simple que modifier ses propriétés dans le contexte ; Core Data suit automatiquement les changements. Pour supprimer, appelez . N'oubliez pas de sauvegarder le contexte après. Pour les suppressions par lots, utilisez qui fonctionne directement dans le magasin persistant sans charger des objets dans la mémoire, améliorant considérablement les performances.

Meilleures pratiques pour la production-données de base prêtes à l'emploi

Même une pile Core Data bien configurée peut devenir un goulot d'étranglement ou source de bogues si elle n'est pas manipulée avec soin.

Sécurité des fils et écueil

Les contextes de données de base ne sont pas sécurisés par défaut. Ne partagez jamais un contexte entre les threads. Utilisez plutôt la méthode sur pour créer un contexte de file d'attente privé pour les opérations de fond. Lorsque vous accédez aux objets sur le thread principal, utilisez ou pour assurer le confinement des threads. Pour SwiftUI, l'emballage de propriété observe automatiquement les changements sur le contexte principal, mais les récupérations lourdes doivent encore être déchargées dans des contextes de fond.

Version et migration

Au fur et à mesure que votre application évolue, votre modèle de données changera – adjuger des attributs, renommer des entités ou modifier des relations. Core Data prend en charge deux types de migration : migration légère et migration personnalisée. Migration légère gère automatiquement les changements simples (adjuger des attributs, changer d'option, renommer des propriétés avec un identifiant) si vous passez des options lors de l'ajout du magasin.

Optimisation des performances

Utiliser index[ sur les attributs qui apparaissent fréquemment dans les prédicats. Évitez de récupérer des graphiques d'objets entiers lorsqu'un sous-ensemble est nécessaire; utilisez plutôt et . Support des données de base fautrise[, où les propriétés d'un objet ne sont pas chargées jusqu'à ce qu'elles soient accessibles. Vous pouvez précéder les relations avec pour éviter les «fault-firing» en hauteur pendant la défilement de la table. Pour les données en lecture seule, envisager d'utiliser pour récupérer des dictionnaires plutôt que des objets gérés en entier.

Gestion des erreurs

Chaque opération de récupération, d'enregistrement et de suppression peut éventuellement échouer. Enfermez toujours ces appels dans des blocs et présentez des messages d'erreur significatifs à l'utilisateur. Les erreurs de sauvegarde sont souvent dues à des erreurs de validation ou à des violations de contraintes, alors vérifiez attentivement les erreurs. Les objets d'erreur de Core Data contiennent plusieurs erreurs sous-jacentes, que vous pouvez itérer pour fournir des commentaires spécifiques.

Intégration des données de base avec SwiftUI

SwiftUI fournit une prise en charge de première classe des données de base par des enveloppeurs de propriétés et des valeurs d'environnement. L'enveloppe observe automatiquement le contexte principal et rafraîchit la vue lorsque les données changent. Vous pouvez configurer les descripteurs de tri et prescrire directement dans la déclaration de propriété. Pour un contrôle plus granulaire, injectez le contexte d'objet géré dans l'environnement en utilisant . Lorsque vous travaillez avec `@ObservedObject` ou `@StateObject` pour un modèle de vue, assurez-vous que le modèle de vue contient une référence à un contexte de fond si vous effectuez des opérations lourdes.

SwiftUI simplifie également la gestion des annulations : set sur le contexte, et SwiftUI s'intègre automatiquement aux gestes d'annulation/redo du système.

Données de base par rapport à d'autres options de persistance

Bien que Core Data soit la solution la plus mature et la plus intégrée pour le stockage local iOS, ce n'est pas toujours le meilleur choix.

  • UserDefaults:[ Convient à de petites quantités de préférences des utilisateurs, mais pas à des données complexes ou importantes.
  • Réalité: Offre une API plus simple et des mises à jour réactives automatiques, mais ajoute une dépendance et ne s'intègre pas aussi profondément avec SwiftUI.
  • Raw SQLite:[ Permet un contrôle et une performance maximums pour les très gros ensembles de données ou les requêtes complexes, mais nécessite la gestion manuelle des connexions, des migrations et des threads.
  • CloudKit + Core Data:[ Pour les applications nécessitant une synchronisation iCloud, Apple bridges Core Data et CloudKit, synchronisant automatiquement les modifications locales au cloud.

Pour la plupart des applications iOS standard qui nécessitent des données structurées, des relations et des capacités hors ligne, Core Data reste le choix recommandé en raison de son intégration transparente avec la plate-forme et le support Apple continu.

Conclusion

En comprenant son architecture, du contexte de l'objet géré au conteneur persistant, et en suivant des pratiques éprouvées de cohérence, de performance et de gestion des erreurs, les développeurs peuvent construire des applications à la fois robustes et réactives. Que vous construisiez une liste simple à faire ou une application d'entreprise à forte intensité de données, la maîtrise des données de base est une compétence précieuse qui permet une gestion efficace des données locales sur iOS.

Pour plus d'étude, consultez le documentation sur les données de base d'Apple, le Guide de programmation des données de base[ et les ressources communautaires telles que Ray Wenderlich's Core Data by Tutorials pour des exercices pratiques et des idées plus approfondies sur des sujets avancés comme la migration et la convergence.