Vous savez de quoi j'ai envie ? Je crois que j'ai bien envie de sauvegarder notre tout premier objet avec Core Data ! Et comme le monde est bien fait, c'est précisément ce que nous allons faire dans ce chapitre !
On t'a connu plus en forme sur les introductions de chapitre...
Peut-être... mais c'est assez désobligeant de le faire remarquer !
Bref, dans notre PeopleViewController
, lors de l'appui sur le bouton Terminé du clavier, on ne sauvegarde pas encore les participants.
C'est bientôt de l'histoire ancienne !
Préparez le terrain
Lorsqu'on appuie sur le bouton Terminé du clavier, cela appelle la méthode addPerson
de PeopleViewController
que voici :
private func addPerson() {
guard
let personName = peopleTextField.text,
var people = peopleTextView.text
else { return }
people += personName + "\n"
peopleTextView.text = people
peopleTextField.text = ""
// TODO: Save person
}
Cette méthode fait deux choses :
Elle récupère les données du champ de texte et de la Text View.
Elle rajoute le nom du nouveau participant à la liste des précédents dans la Text View.
Et elle va bientôt en faire une troisième. Nous allons sauvegarder notre nouveau participant dans la base de données à la place de notre commentaire TODO. Je vous propose qu'on fasse ça dans une méthode savePerson
à part :
private func addPerson() {
// (...)
savePerson(named: personName)
}
private func savePerson(named name: String) {
}
Maintenant, nous allons créer notre nouvel objet Person
. Il s'agit tout simplement de créer une instance de la classe Person
.
Analysez le contexte pour créer un objet pertinent
Seulement, souvenez-vous que pour manipuler des objets de Core Data, il nous faut un contexte. On va du coup préciser le contexte avec lequel on souhaite créer cet objet lors de l'initialisation.
Person
hérite NSManagedObject
qui admet l'initialiseur suivant :
init(context: NSManagedObjectContext)
OK, mais on va utiliser quoi comme contexte ?
Lorsqu'on a installé Core Data, on a récupéré un contexte de notre persistentContainer
via la propriété viewContext
. On en avait fait une propriété static
dans CoreDataStack
de façon à pouvoir récupérer notre contexte en écrivant simplement :
CoreDataStack.sharedInstance.viewContext
C'est ce contexte que l'on va utiliser.
Créez l'objet Person
On a l'initialiseur, on a la valeur à lui passer, let's go !
private func savePerson(named name: String) {
// create entity instance with context
let person = Person(context: CoreDataStack.sharedInstance.viewContext)
}
Ça y est ! J'ai un objet Person
qui a été ajouté dans mon contexte. Maintenant, je peux le manipuler comme n'importe quel objet Swift. Par exemple, pour donner une valeur à son attribut name
, j'écris tout simplement :
private func savePerson(named name: String) {
// create entity instance with context
let person = Person(context: CoreDataStack.sharedInstance.viewContext)
// use
person.name = name
}
Et voilà ! Sans plus de difficultés, on a créé notre premier objet Core Data.
Sauvegardez le contexte
Souvenez-vous, le contexte est un bloc-notes intelligent qui va noter tous les ajouts / suppressions / modifications d'objet.
Donc pour que notre objet person
soit effectivement ajouté dans la base de données, il faut sauvegarder le contexte. Et cela se fait très facilement avec la méthode save de NSManagedObjectContext
:
private func savePerson(named name: String) {
// create entity instance with context
let person = Person(context: CoreDataStack.sharedInstance.viewContext)
// use
person.name = name
CoreDataStack.sharedInstance.viewContext.save()
}
Il se trouve que la méthode save
peut renvoyer une erreur. Donc il faut l'utiliser avec try?
.
try? CoreDataStack.sharedInstance.viewContext.save()
Vous pouvez aussi utiliser do/catch
pour gérer les erreurs et afficher une alerte à l'utilisateur au cas où la sauvegarde échoue. Mais je vous fais confiance pour réussir à faire ça sans moi.
Et voilà ! Il suffit de trois lignes pour créer un objet dans le contexte, modifier ses propriétés et sauvegarder le contexte avec notre nouvel objet.
En résumé
Pour sauvegarder un objet :
On crée une instance de la classe désirée en lui passant le contexte lors de l'initialisation.
On manipule les propriétés comme n'importe quel objet Swift.
On sauvegarde le contexte.
Dans le prochain chapitre, on va apprendre à récupérer les données sauvegardées avec Core Data !