Einleitung: Warum braucht ein Swift-Entwickler Datenbanken?
Moderne Anwendungen für iOS und macOS kommen selten ohne Datenspeicherung aus. Ob Aufgabenliste, Benutzerprofil oder Produktkatalog – Daten müssen irgendwo gespeichert und abgerufen werden. Swift, als Hauptsprache des Apple-Ökosystems, bietet leistungsstarke Werkzeuge für die Arbeit mit Datenbanken (DB). In diesem Artikel schauen wir uns an, wie ein Anfänger-Entwickler eine Verbindung herstellt und CRUD-Operationen (Erstellen, Lesen, Aktualisieren, Löschen) mit zwei beliebten Systemen durchführt: der relationalen PostgreSQL und der dokumentenorientierten MongoDB.
Wir werden das serverseitige Framework Vapor (basierend auf SwiftNIO) für die Arbeit mit PostgreSQL und den beliebten Treiber MongoKitten für MongoDB verwenden. Beide Optionen eignen sich hervorragend für ein Backend in Swift. Wenn Sie gerade erst anfangen – keine Angst: Der gesamte Code ist einfach und mit Erklärungen versehen.
1. PostgreSQL und Swift: Klassiker der relationalen DBs
PostgreSQL ist eine leistungsstarke relationale Datenbank mit SQL-Unterstützung. Für Swift ist die beste Art der Interaktion das Framework Vapor und sein ORM Fluent. Fluent ermöglicht es, mit Tabellen wie mit gewöhnlichen Swift-Strukturen zu arbeiten.
1.1. Einrichtung des Vapor-Projekts
Installieren Sie zuerst die Vapor Toolbox und erstellen Sie ein Projekt:
brew install vaporvapor new MyAppcd MyAppFügen Sie die Abhängigkeit für PostgreSQL in Package.swift hinzu:
dependencies: [ .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"), .package(url: "https://github.com/vapor/fluent.git", from: "4.0.0"), .package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0")]1.2. Modell und Migration
Erstellen wir ein einfaches Modell User:
import Fluentimport Vapor
final class User: Model, Content { static let schema = "users" @ID(key: .id) var id: UUID? @Field(key: "name") var name: String @Field(key: "email") var email: String init() { } init(id: UUID? = nil, name: String, email: String) { self.id = id self.name = name self.email = email }}Jetzt die Migration zum Erstellen der Tabelle:
struct CreateUser: Migration { func prepare(on database: Database) -> EventLoopFuture<Void> { database.schema("users") .id() .field("name", .string, .required) .field("email", .string, .required) .create() } func revert(on database: Database) -> EventLoopFuture<Void> { database.schema("users").delete() }}Registrieren Sie die Migration in configure.swift:
app.migrations.add(CreateUser())1.3. CRUD-Operationen
Datensatz erstellen (Create):
let user = User(name: "Ivan", email: "ivan@example.com")try await user.save(on: database)Lesen (Read):
let users = try await User.query(on: database).all()let user = try await User.find(id, on: database)Aktualisieren (Update):
guard let user = try await User.find(id, on: database) else { return }user.name = "Neuer Name"try await user.update(on: database)Löschen (Delete):
guard let user = try await User.find(id, on: database) else { return }try await user.delete(on: database)Fluent generiert automatisch SQL-Abfragen, was das Leben für Anfänger erheblich vereinfacht.
2. MongoDB und Swift: Flexibilität von NoSQL
MongoDB ist eine dokumentenbasierte DB, in der Daten im BSON-Format (binäres JSON) gespeichert werden. Für Swift verwenden wir die Bibliothek MongoKitten – eine ausgereifte und aktiv unterstützte