Maintenant que Core Data est installée, nous allons pouvoir enfin jouer avec ! Dans le reste des chapitres de cette partie, nous allons utiliser Core Data pour sauvegarder les différentes personnes dont on souhaite noter les dépenses.
Dans ce chapitre, nous allons travailler dans le fichier xcdatamodeld
pour définir notre premier modèle : Person
.
Ajoutez l'entité Person
Quand vous ouvrez le fichier xcdatamodeld
, il ressemble à ceci :
Dans ce fichier, vous allez pouvoir définir votre schéma de données. Quelles sont les différentes entités ? Quels sont leurs attributs, leurs relations entre eux, etc. ?
On va rajouter notre première entité : Person
. Pour cela, il faut cliquer sur le bouton Add Entity
en bas à gauche :
Une nouvelle entité apparaît dans la section Entities.
En double-cliquant dessus, vous allez pouvoir modifier son nom et la nommer Person
.
Et voilà ! Vous avez créé votre première entité !
Ajoutez un attribut
Sur la droite, vous avez une section Attributes
. Nous allons rajouter un premier attribut à notre entité.
Pour cela, cliquez sur le bouton +
:
Un nouvel attribut apparaît :
Vous pouvez modifier son nom. Nous allons l'appeler name
, car il nous permettra de stocker le nom de la personne.
Ensuite, vous pouvez cliquer sur la liste déroulante pour choisir son type :
Dans la liste, vous avez plusieurs types possibles pour stocker des données ; vous en reconnaissez la plupart, je pense. Il y a les types numériques, les chaînes de caractères, les dates, les booléens, les data, etc.
Pour notre propriété name , on va bien sûr choisir String
.
Et voilà ! Notre attribut est maintenant créé !
Générez automatiquement du code
Je vous ai vendu Core Data comme une base de données orientée objet, dans laquelle, pour gérer vos objets, cela ressemblerait à ceci :
let person = Person()
person.name = "Jean-Pierre"
Je ne vous ai pas menti. Le seul problème, c'est que par défaut, pour créer un objet, il faut en fait écrire ceci :
let person: NSManagedObject = NSEntityDescription.insertNewObject(forEntityName: "Person", into: AppDelegate.viewContext)
person.setValue("Jean-Pierre", forKey: "name")
C'est beaucoup moins joli. Pour avoir le droit à l'option toute belle du dessus, il faut demander à Core Data de générer automatiquement pour nous la classe Person
.
Et c'est très simple : sélectionnez votre entité, puis dans les utilitaires à droite, sélectionnez le quatrième onglet (l'inspecteur de modèle de données). On va s'intéresser au réglage Codegen pour Code Generation (en français, génération automatique de code).
Dans le menu déroulant, vous avez trois options :
Manual/None : Cela signifie qu'Xcode ne génère aucun code pour vous.
Class Definition : Cela signifie qu'Xcode génère pour vous une classe
Person
qui va hériter deNSManagedObject
pour être un objet deCore Data
.Category/Extension : C'est à vous de créer une classe
Person
. Xcode va générer automatiquement une extension pour que votre classe se conforme àNSManagedObject
.
Je vous propose de choisir Category/Extension
. La raison, c'est qu'on préfère créer nous-même la classe. Ça nous permet de lui rajouter des propriétés et des méthodes si besoin. On laisse juste Xcode étendre notre classe pour lui ajouter les fonctionnalités liées à Core Data.
Je vous invite donc à choisir Category/Extension. Et Xcode génère pour vous le code suivant :
// Person+CoreDataProperties.swift
import CoreData
extension Person {
@nonobjcpublic class func fetchRequest() -> NSFetchRequest<Person> {
return NSFetchRequest<Person>(entityName: "Person")
}
@NSManagedpublic var name: String?
}
On retrouve notre propriété name de type String?
. Elle est précédée par la mention @NSManaged
qui permet à Xcode de faire le lien avec l'attribut de votre entité.
Et il y a une deuxième méthode, fetchRequest
, qui retourne un objet de type NSFetchRequest
. NSFetchRequest
est la classe qui permet au contexte de réclamer des objets à la base de données. Cette méthode vous permet donc d'obtenir une instance de NSFetchRequest
, dédiée à la récupération d'objets Person
.
Créez la classe Person
Pour faire fonctionner cette extension, il nous faut créer notre classe Person
. Donc je vous laisse faire ça dans le modèle en ajoutant un fichier Person.swift
.
Pour que Person
soit un objet au sens de Core Data, il doit hériter de la classe NSManagedObject
:
import CoreData
class Person: NSManagedObject {
}
Et voilà ! Votre première entité est parfaitement fonctionnelle !
Évitez des ennuis
Enfin, un petit bug d'Xcode peut intervenir si vous ne précisez pas le module dans lequel évolue l'entité.
En attendant qu'Apple se penche sur la question, vous pouvez empêcher ça très facilement en indiquant Current Product Module comme valeur du réglage Module dans l'inspecteur de modèle de données.
En résumé
On ajoute des entités et des attributs dans le fichier
xcdatamodeld
en utilisant les boutons Add Entity et Add Attribute.On peut préciser le nom de notre entité et le nom et le type d'un attribut.
Xcode génère automatiquement le code correspondant au modèle défini dans le fichier
xcdatamodeld
. C'est grâce à cela qu'on peut utiliser nos objets de la base de données comme des objets Swift classiques.Pour cela, nos classes doivent hériter de
NSManagedObject
.
Dans le prochain chapitre, nous allons apprendre à créer et sauvegarder nos objets !