ORM für Swift (iOS/macOS): Vergleich und Beispiele
Bei der Entwicklung von Anwendungen für iOS und macOS stehen Entwickler oft vor der Notwendigkeit, Daten auf dem Gerät zu speichern. Zur Vereinfachung der Arbeit mit Datenbanken werden ORMs (Object-Relational Mapping) verwendet – Bibliotheken, die es ermöglichen, mit Daten wie mit gewöhnlichen Swift-Objekten zu arbeiten und die Komplexität von SQL-Abfragen zu verbergen. In diesem Artikel betrachten wir vier beliebte Lösungen: Core Data, Realm, GRDB und SQLite.swift, vergleichen ihre Funktionen und geben praktische Beispiele.
1. Core Data
Core Data ist ein Framework von Apple, das in iOS und macOS integriert ist. Es ist keine reine ORM, sondern ein Framework zur Verwaltung von Objektgraphen, das SQLite, XML oder binäre Speicherung nutzen kann.
Vorteile:
- Tiefe Integration in das Apple-Ökosystem (SwiftUI, iCloud, Undo Manager).
- Visueller Editor für Datenmodelle (Xcode Data Modeler).
- Unterstützung für Versionierung und Migrationen.
Nachteile:
- Hohe Einstiegshürde (viel Boilerplate-Code).
- Leistungsprobleme bei der Arbeit mit großen Datenmengen.
- Starke Bindung an Apple-Plattformen.
Codebeispiel (Swift):
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()request.predicate = NSPredicate(format: "age > 18")let users = try? context.fetch(request)2. Realm
Realm ist eine plattformübergreifende ORM, die speziell für mobile Anwendungen entwickelt wurde. Sie ist bei Lese- und Schreiboperationen schneller als Core Data.
Vorteile:
- Hohe Leistung (bis zu 10x schneller als Core Data).
- Einfache API ohne SQL-Kenntnisse.
- Automatische Aktualisierung von Objekten (Live Objects).
- Unterstützung für reaktive Erweiterungen (RxRealm, Combine).
Nachteile:
- Geschlossenes Datenbankdateiformat.
- Begrenzte Datenbankgröße (bis zu 2 GB auf iOS).
- Weniger Flexibilität für komplexe Abfragen.
Codebeispiel (Swift):
import RealmSwift
// Modell definierenclass User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}
// Speichernlet realm = try! Realm()let user = User()user.name = "Maria"user.age = 25
try! realm.write { realm.add(user)}
// Abfragelet users = realm.objects(User.self).filter("age > 18")for user in users { print("\\(user.name): \\(user.age)")}3. GRDB
GRDB ist eine moderne Bibliothek für die Arbeit mit SQLite in Swift. Sie kombiniert die Möglichkeiten des Low-Level-Zugriffs auf SQL mit dem Komfort einer ORM.
Vorteile:
- Maximale Leistung (natives SQLite).
- Unterstützung für Combine und Swift Concurrency (async/await).
- Vollständige Kontrolle über SQL-Abfragen.
- Unterstützung für Migrationen und Versionierung.
Nachteile:
- Erfordert SQL-Kenntnisse.
- Weniger "Magie" – mehr manueller Code.
Codebeispiel (Swift):
import GRDB
// Modell definierenstruct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String var age: Int}
// Verbindung zur Datenbanklet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
// Speicherntry dbQueue.write { db in let user = User(nam Auch in der Bibliothek
Caching in Rust: Redis, Memcached und integrierte Lösungen