ORM для Swift (iOS/macOS): сравнение и примеры
При разработке приложений под iOS и macOS разработчики часто сталкиваются с необходимостью хранения данных на устройстве. Для упрощения работы с базами данных используются ORM (Object-Relational Mapping) — библиотеки, которые позволяют работать с данными как с обычными объектами Swift, скрывая сложность SQL-запросов. В этой статье мы рассмотрим четыре популярных решения: Core Data, Realm, GRDB и SQLite.swift, сравним их возможности и приведём практические примеры.
1. Core Data
Core Data — это фреймворк от Apple, встроенный в iOS и macOS. Он не является чистой ORM, а представляет собой фреймворк для управления графом объектов, который может использовать SQLite, XML или бинарное хранилище.
Преимущества:
- Глубокая интеграция с экосистемой Apple (SwiftUI, iCloud, Undo Manager).
- Визуальный редактор модели данных (Xcode Data Modeler).
- Поддержка версионирования и миграций.
Недостатки:
- Высокий порог входа (много boilerplate-кода).
- Проблемы с производительностью при работе с большими наборами данных.
- Жёсткая привязка к платформам Apple.
Пример кода (Swift):
import CoreData
// Создание контекста
let container = NSPersistentContainer(name: "Model")
container.loadPersistentStores { _, error in
if let error = error { print(error) }
}
// Сохранение объекта
let context = container.viewContext
let user = User(context: context)
user.name = "Иван"
user.age = 30
try? context.save()
// Запрос
let request: NSFetchRequest<User> = User.fetchRequest()
request.predicate = NSPredicate(format: "age > 18")
let users = try? context.fetch(request)
2. Realm
Realm — это кроссплатформенная ORM, разработанная специально для мобильных приложений. Она работает быстрее Core Data на операциях чтения и записи.
Преимущества:
- Высокая производительность (до 10x быстрее Core Data).
- Простой API без необходимости писать SQL.
- Автоматическое обновление объектов (live objects).
- Поддержка реактивных расширений (RxRealm, Combine).
Недостатки:
- Закрытый формат файлов базы данных.
- Ограниченный размер базы (до 2 ГБ на iOS).
- Меньше гибкости для сложных запросов.
Пример кода (Swift):
import RealmSwift
// Определение модели
class User: Object {
@Persisted var name: String = ""
@Persisted var age: Int = 0
}
// Сохранение
let realm = try! Realm()
let user = User()
user.name = "Мария"
user.age = 25
try! realm.write {
realm.add(user)
}
// Запрос
let users = realm.objects(User.self).filter("age > 18")
for user in users {
print("\(user.name): \(user.age)")
}
3. GRDB
GRDB — это современная библиотека для работы с SQLite в Swift. Она сочетает в себе возможности низкоуровневого доступа к SQL и удобство ORM.
Преимущества:
- Максимальная производительность (нативный SQLite).
- Поддержка Combine и Swift Concurrency (async/await).
- Полный контроль над SQL-запросами.
- Поддержка миграций и версионирования.
Недостатки:
- Требует знания SQL.
- Меньше "магии" — больше ручного кода.
Пример кода (Swift):
import GRDB
// Определение модели
struct User: Codable, FetchableRecord, PersistableRecord {
var id: Int64?
var name: String
var age: Int
}
// Подключение к базе
let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
// Сохранение
try dbQueue.write { db in
let user = User(name: "Алексей", age: 28)
try user.insert(db)
}
// Запрос
let users = try dbQueue.read { db in
try User.filter(Column("age") > 18).fetchAll(db)
}
print(users)
4. SQLite.swift
SQLite.swift — это минималистичная обёртка над SQLite с типизированным API. Она не является полноценной ORM, но позволяет писать типобезопасные запрос
Также в библиотеке
Elasticsearch клиент для Kotlin: интеграция, примеры и возможности
OAuth клиент для C# (.NET): библиотека IdentityModel и интеграция с OAuth 2.0
MongoDB.Driver для C# (.NET): полное руководство с примерами
CoreBluetooth для Swift: полное руководство с примерами
Отправка email на Rust: библиотеки lettre и async-smtp для почтовых рассылок