ORM für Swift (iOS/macOS): Vergleich und Beispiele
Bei der Entwicklung von Anwendungen für iOS und macOS besteht häufig die Notwendigkeit, mit lokalen Datenbanken zu arbeiten. ORM (Object-Relational Mapping) ermöglicht die Arbeit mit Daten über Objekte der Programmiersprache und abstrahiert von SQL-Abfragen. Im Swift-Ökosystem gibt es mehrere beliebte Lösungen. In diesem Artikel vergleichen wir Core Data, Realm, GRDB und SwiftData, zeigen Codebeispiele und helfen Ihnen, das passende Werkzeug für Ihr Projekt auszuwählen.
1. Core Data
Core Data ist ein integriertes Apple-Framework, das nicht nur ORM, sondern auch einen vollständigen Stack zur Objektverwaltung (Objektdiagramm, Lazy Loading, Undo/Redo) bietet. Es arbeitet mit SQLite, XML oder binärem Speicher. Die Grundidee ist die Arbeit über NSManagedObjectContext.
Codebeispiel (Core Data)
import CoreData
// Kontext erstellenlet container = NSPersistentContainer(name: "Model")container.loadPersistentStores { _, error in if let error = error { print(error) }}
// Objekt speichernlet context = container.viewContextlet user = User(context: context)user.name = "Ivan"user.age = 30
try? context.save()
// Abfragelet request: NSFetchRequest<User> = User.fetchRequest()let users = try? context.fetch(request)Vorteile: vollständige Integration mit Xcode, automatische Migrationsverwaltung, Unterstützung für iCloud.
Nachteile: hohe Einstiegshürde, Notwendigkeit, das Datenmodell im Editor zu erstellen, viel Boilerplate-Code.
2. Realm
Realm ist eine plattformübergreifende ORM, die auf einer eigenen Engine (nicht SQLite) basiert. Sie ist in den meisten Operationen schneller als Core Data und hat eine einfachere API. Unterstützt Swift, Objective-C, Kotlin, Java.
Codebeispiel (Realm)
import RealmSwift
// Modell definierenclass User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}
// Speichernlet realm = try! Realm()let user = User(value: ["name": "Maria", "age": 25])try! realm.write { realm.add(user)}
// Abfragelet users = realm.objects(User.self).filter("age > 18")Vorteile: hohe Leistung, benutzerfreundliche API, integrierte Unterstützung für Live Objects (automatische UI-Aktualisierung).
Nachteile: proprietäre Lizenz (seit 2020 Open Source, aber mit Einschränkungen), große Binärgröße, Schwierigkeiten bei Migrationen.
3. GRDB
GRDB ist eine leichtgewichtige Bibliothek für die Arbeit mit SQLite in Swift. Sie bietet sowohl einen Low-Level-Zugriff auf SQL als auch ein High-Level-ORM mit Record-Typen. Dies ist eine ausgezeichnete Wahl für diejenigen, die SQL-Abfragen kontrollieren möchten, aber nicht manuell schreiben wollen.
Codebeispiel (GRDB)
import GRDB
// Struktur definierenstruct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String var age: Int}
// Verbindung zur DBlet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
// Speicherntry dbQueue.write { db in var user = User(name: "Alexej", age: 28) try user.insert(db)}
// Abfragelet users = try dbQueue.read { db in try User.filter(Column("age") >= 18).fetchAll(db)}Vorteile: geringes Gewicht, vollständige Kontrolle über SQL, hervorragende Dokumentation, Unterstützung für Combine und Swift Concurrency.
Nachteile: erfordert manuelle Migrationsverwaltung, nicht so "magisch" wie Realm.
4. SwiftData (Neuheit von Apple)
SwiftData ist ein modernes ORM, das auf der WWDC 2023 vorgestellt wurde. Es baut auf Core Data auf, verwendet jedoch Swift-Makros (@Model, @Attribute, @Relationship). Es ermöglicht die Beschreibung von Modellen direkt im Code.
Codebeispiel (SwiftData)
import SwiftDataimport SwiftUI
@Modelclass User { var name: String var age: Int init(name: String, age: Auch in der Bibliothek
MPAndroidChart für Kotlin: Komplettguide mit Beispielen
PDF-Erstellung in JavaScript (Node.js): Bibliotheken und Werkzeuge
Internationalisierung (i18n) in TypeScript: Vollständiger Leitfaden
PDF-Generierung in C# (.NET): Vollständiger Leitfaden zu Bibliotheken