Avec SwiftData, effectuer des opération CRUD (Create, Read, Update, Delete) est un charme.
Dans cette fiche :
L'insertion de données consiste à instancier un nouvel objet puis à faire appel à modelContext.insert().
Je vous présente ici l'insertion à l'intérieur de ContentView mais cela pourrait avoir lieu dans n'importe quelle autre vue.
Notez que dans ces exemples, on considère que l'enregistrement automatique est activé – ce qui est le cas par défaut – donc il n'y a pas d'appel à save().
import SwiftData
...
Struct ContentView: View {
@Environment(\.modelContext) var modelContext
...
var body: some View {
...
Button(action: {
let item = Item(code: "abc", titre: "Item abc")
modelContext.insert(item)
...
}) {
Text("Enregistrer")
}
.buttonStyle(.bordered)
...
}
}
Pour supprimer un enregistrement, il est important d'avoir en main un objet qui a été instancié à partir d'une requête.
La façon la plus traditionnelle consiste à créer le bouton de suppression à même la liste qui affiche les données.
Le traitement consistera à appeler modelContext.delete().
List(items) { item in
VStack(alignment: .leading) {
HStack {
Text("\(item.code) - \(item.titre)")
Spacer()
Button(
role: .destructive,
action: {
modelContext.delete(item)
...
}) {
Image(systemName: "trash")
}
}
}
}
Il est d'usage de demander confirmation avant suppression puisque cette opération est irréversible.
Pour y arriver :
Pour supprimer tous les enregistrements d'une table, il suffit d'appeler la méthode delete() avec le modèle comme paramètre.
do {
try modelContext.delete(model: Item.self)
...
} catch {
print("Impossible de supprimer tous les items.")
}
La mise à jour sera généralement effectuée à partir d'un formulaire qui aura été affiché à partir de la liste d'items. On sera ainsi assurés que c'est le bon enregistrement qui est mis à jour.
Contrairement à l'ajout et à la suppression, il suffit de mettre à jour l'objet pour que les données soient enregistrées dans la base de données.
Button(
action: {
item.nom = nom
item.titre = titre
...
}) {
Text("Enregistrer")
}
Par défaut, les modifications au modelContext seront automatiquement réflétées dans la base de données.
L'usager aura l'impression que les données sont enregistrées sur-le-champ. Dans les faits, l'enregistrement aura lieu à des moments précis, par exemple lorsque l'application passe en arrière-plan ou revient au premier-plan ou encore lorsque la boucle courante se termine. Ce délai peut être de quelques fractions de secondes mais s'étire parfois sur une trentaine de secondes.
Il y a des situations où ce délai peut causer des mauvais fonctionnements de l'application.
C'est le cas, par exemple, si on ajoute un enregistrement puis qu'on appelle immédiatement une fonction qui utilise cet enregistrement.
Pour assurer que l'enregistrement soit immédiatement disponible, il faut faire appel à modelContext.save().
Dans cet exemple, le code doit appeler une fonction qui synchronise la base de données locale avec une base de données distante via un service Web.
let item = Item(code: "abc", titre: "Item abc")
modelContext.insert(item)
do {
try modelContext.save() // sans ceci, l'item n'est pas encore disponible pour la synchro
} catch {
print("Impossible d'ajouter l'item: \(error)")
... // mécanisme pour afficher un message à l'usager
}
synchroniserBD()
Si vous obtenez l'erreur « Thread 1: Fatal error: Observation Registrar was not found on Model » lors de l'ajout, de la modification ou de la suppresison d'un enregistrement, assurez-vous que le modèle ne répond pas au protocole CustomReflectable.
En effet, il semble y avoir un conflit entre le protocole CustomReflectable et le mécanisme d'observation utilisé par SwiftData.
« Adding and editing persistent data in your app ». Apple. https://developer.apple.com/documentation/swiftdata/adding-and-editing-persistent-data-in-your-app/
« Deleting persistent data from your app ». Apple. https://developer.apple.com/documentation/swiftdata/deleting-persistent-data-from-your-app
« Creating, editing, and deleting model objects ». Hacking with Swift. https://www.hackingwithswift.com/quick-start/swiftdata/creating-editing-and-deleting-model-objects
« When does SwiftData autosave data? ». Hacking with Swift. https://www.hackingwithswift.com/quick-start/swiftdata/when-does-swiftdata-autosave-data
« How to save a SwiftData object ». Hacking with Swift. https://www.hackingwithswift.com/quick-start/swiftdata/how-to-save-a-swiftdata-object
▼Publicité