Ответ
Realm — это кроссплатформенная объектно-ориентированная база данных (NoSQL), а Core Data — фреймворк Apple для управления графом объектов с возможностью сохранения состояния (persistence).
Основные отличия
| Критерий | Realm | Core Data |
|---|---|---|
| Архитектура | Объектная база данных | Фреймворк для управления объектным графом и persistence |
| Производительность | Часто быстрее при операциях чтения/записи, особенно с большими данными | Может быть медленнее, зависит от настройки (SQLite, XML, in-memory) |
| API и простота | Более простой и интуитивный API, меньше boilerplate-кода | Более сложный, требует настройки контекстов (NSManagedObjectContext), моделей |
| Многопоточность | Объекты автоматически обновляются между потоками, потокобезопасны по умолчанию | Требует ручного управления контекстами (perform блоки, mergeChanges) |
| Кроссплатформенность | Поддерживает iOS, Android, macOS, другие платформы | Экосистема Apple (iOS, macOS, tvOS, watchOS) |
| Схема данных | Динамическая, миграции часто проще | Строгая, требует версионирования модели и миграций |
Пример кода
Realm: Создание и сохранение объекта
// 1. Определение модели
class Dog: Object {
@Persisted var name = ""
@Persisted var age = 0
}
// 2. Операция записи
let realm = try! Realm()
try! realm.write {
let myDog = Dog()
myDog.name = "Rex"
myDog.age = 3
realm.add(myDog)
}
Core Data: Создание и сохранение объекта
// 1. Получение контекста (обычно из `NSPersistentContainer`)
let context = persistentContainer.viewContext
// 2. Создание объекта
let dog = Dog(context: context) // `Dog` — подкласс `NSManagedObject`
dog.name = "Rex"
dog.age = 3
// 3. Сохранение
try? context.save()
Когда что выбирать?
- Realm: Нужна высокая производительность, простота API, кроссплатформенность или работа с большими объемами данных.
- Core Data: Проект глубоко интегрирован в экосистему Apple, требуются сложные связи между объектами, или есть legacy-код.