ORM для Swift (iOS/macOS): сравнение и примеры использования

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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, но позволяет писать типобезопасные запрос

Рекомендаций