ORM pour Swift (iOS/macOS) : comparaison et exemples d'utilisation

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

ORM pour Swift (iOS/macOS) : comparaison et exemples

Lors du développement d'applications pour iOS et macOS, il est souvent nécessaire de travailler avec des bases de données locales. L'ORM (Object-Relational Mapping) permet de travailler avec les données via des objets du langage de programmation, en s'abstrayant des requêtes SQL. Dans l'écosystème Swift, il existe plusieurs solutions populaires. Dans cet article, nous comparerons Core Data, Realm, GRDB et SwiftData, fournirons des exemples de code et vous aiderons à choisir l'outil adapté à votre projet.



1. Core Data

Core Data est un framework intégré d'Apple qui offre non seulement un ORM, mais aussi une pile complète de gestion d'objets (graphe d'objets, lazy loading, undo/redo). Il fonctionne avec SQLite, XML ou un stockage binaire. L'idée principale est de travailler via NSManagedObjectContext.



Exemple de code (Core Data)

import CoreData

// Création du contextelet container = NSPersistentContainer(name: "Model")container.loadPersistentStores { _, error in if let error = error { print(error) }}

// Sauvegarde d'un objetlet context = container.viewContextlet user = User(context: context)user.name = "Ivan"user.age = 30

try? context.save()

// Requêtelet request: NSFetchRequest<User> = User.fetchRequest()let users = try? context.fetch(request)


Avantages : intégration complète avec Xcode, gestion automatique des migrations, prise en charge d'iCloud.

Inconvénients : seuil d'entrée élevé, nécessité de créer le modèle de données dans l'éditeur, beaucoup de code boilerplate.



2. Realm

Realm est un ORM multiplateforme fonctionnant sur son propre moteur (pas sur SQLite). Il est plus rapide que Core Data dans la plupart des opérations et possède une API plus simple. Il prend en charge Swift, Objective-C, Kotlin, Java.



Exemple de code (Realm)

import RealmSwift

// Définition du modèleclass User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}

// Sauvegardelet realm = try! Realm()let user = User(value: ["name": "Maria", "age": 25])try! realm.write { realm.add(user)}

// Requêtelet users = realm.objects(User.self).filter("age > 18")


Avantages : hautes performances, API pratique, prise en charge intégrée des Live Objects (mise à jour automatique de l'interface utilisateur).

Inconvénients : licence propriétaire (depuis 2020, ouverte mais avec des restrictions), taille importante du binaire, difficultés avec les migrations.



3. GRDB

GRDB est une bibliothèque légère pour travailler avec SQLite en Swift. Elle offre à la fois un accès bas niveau à SQL et un ORM de haut niveau avec des types Record. C'est un excellent choix pour ceux qui veulent contrôler les requêtes SQL sans avoir à les écrire manuellement.



Exemple de code (GRDB)

import GRDB

// Définition de la structurestruct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String var age: Int}

// Connexion à la base de donnéeslet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")

// Sauvegardetry dbQueue.write { db in var user = User(name: "Alexei", age: 28) try user.insert(db)}

// Requêtelet users = try dbQueue.read { db in try User.filter(Column("age") >= 18).fetchAll(db)}


Avantages : léger, contrôle total sur SQL, excellente documentation, prise en charge de Combine et Swift Concurrency.

Inconvénients : nécessite une gestion manuelle des migrations, moins "magique" que Realm.



4. SwiftData (nouveauté d'Apple)

SwiftData est un ORM moderne présenté à la WWDC 2023. Il est construit au-dessus de Core Data, mais utilise les macros Swift (@Model, @Attribute, @Relationship). Il permet de décrire les modèles directement dans le code.



Exemple de code (SwiftData)

import SwiftDataimport SwiftUI

@Modelclass User { var name: String var age: Int init(name: String, age:

Recommendations