Lorsque vous travaillez avec SwiftData, le modèle doit être défini dans une classe spéciale.
Lorsque l'application sera lancée, SwiftData créera automatiquement la base de données avec les tables qui correspondent aux modèles listés dans le modelContainer.
Voici un exemple d'un modèle SwiftData :
import Foundation
import SwiftData
@Model
final class Item {
var code: String
var titre: String
var dateAjout: Date
init(code: String = "", titre: String = "", dateAjout: Date = Date()) {
self.code = code
self.titre = titre
self.dateAjout = dateAjout
}
}
Remarquez l'utilisation du type Date pour stocker une date, même si les dates en SQLite sont stockées sous forme de texte.
SwiftData fera le nécessaire pour faire la conversion entre ces deux formats.
Si vous avez déjà codé un modèle, vous devez apporter quelques ajustements pour qu'il se conforme aux exigences de SwiftData.
import SwiftData
@Model
final class Item {
var code: String
var titre: String
var dateAjout: Date
// le constructeur est requis dans une classe
init(code: String = "", titre: String = "", dateAjout: Date = Date()) {
self.code = code
self.titre = titre
self.dateAjout = dateAjout
}
}
La macro @Model semble anodine, mais elle joue un rôle important.
Elle crée litéralement beaucoup de code pour vous afin que le modèle interagisse avec une table de la base de données.
Si vous êtes curieux de voir le code ajouté, vous pouvez faire un clic droit sur le mot @Model puis choisir .
Ne vous laissez pas impressionner par le code ajouté, il peut demeurer caché (clic droit /
) et vous pourrez tout de même travailler efficacement avec SwiftData.Dans le fichier de l'application (fichier dont le nom est au format MonProjetApp.swift), vous devez spécifier quels modèles doivent être utilisés par SwiftData :
import SwiftUI
import SwiftData
@main
struct MonProjetApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for: Item.self)
}
}
Lorsqu'une application utilise plusieurs tables, donc plusieurs modèles, il y a deux figures de cas :
import SwiftUI
import SwiftData
@main
struct MonProjetApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for: [Item.self, Usager.self])
}
}
Dans le cas où l'application se charge d'insérer des données initiales dans la base de données, l'approche est légèrement différente.
On fera tout de même appel à .modelContainer mais plutôt que de lui passer les modèles en paramètre, on fera appel au conteneur qui est responsable de l'insertion des données (ici, il s'appelle preloadAppContainer).
import SwiftUI
import SwiftData
@main
struct MonProjetApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(preloadAppContainer)
}
}
« Defining a data model with SwiftData ». Hacking with Swift. https://www.hackingwithswift.com/quick-start/swiftdata/defining-a-data-model-with-swiftdata
« Why are SwiftData models created as classes? ». Hacking with Swift. https://www.hackingwithswift.com/quick-start/swiftdata/why-are-swiftdata-models-created-as-classes
▼Publicité