Чем Core Data отличается от базы данных?

Ответ

Core Data — это не база данных, а фреймворк для управления объектным графом и его сохранности. Хотя он часто использует SQLite как бэкенд-хранилище, его абстракция работает на уровне объектов, а не таблиц.

Ключевые отличия:

Аспект Core Data База данных (например, SQLite)
Уровень абстракции Объектная модель (сущности, связи) Реляционные таблицы, строки, столбцы
Основная задача Управление жизненным циклом объектов в памяти, их связями и сохранением Хранение и эффективный запрос структурированных данных
Запросы NSFetchRequest с NSPredicate (объектно-ориентированный) Язык SQL (декларативный, реляционный)
Изменения в памяти Автоматическое отслеживание, откат (undo), валидация Не отслеживаются, требуют явных команд UPDATE/INSERT

Пример выборки:

let request: NSFetchRequest<User> = User.fetchRequest()
request.predicate = NSPredicate(format: "name == %@", "John")
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let users = try? context.fetch(request)

Когда использовать Core Data:

  • Приложение следует парадигме Model-View-Controller (MVC) Apple.
  • Нужны сложные связи между объектами (один-ко-многим, многие-ко-многим).
  • Требуется встроенная поддержка отмены операций или поэтапной миграции схемы.

Когда рассмотреть прямую работу с SQLite:

  • Критична максимальная производительность на сложных JOIN-запросах.
  • Данные имеют простую структуру, а объектная модель избыточна.
  • Необходим прямой контроль над SQL-запросами и схемой.

Ответ 18+ 🔞

Да ты послушай, что за дичь происходит в мире этих яблочных разработчиков! Сидят, блядь, и свято верят, что Core Data — это база данных. Ну, типа, открыл, сохранил — и всё, магия! А на самом деле, ёпта, это же просто фреймворк, который над твоим объектным графом колдует. Да, он там внизу, в подполье, часто SQLite юзает, как раба на галерах, но сам-то он с тобой на языке объектов разговаривает, а не этих твоих таблиц, блядь, с JOIN'ами.

Вот смотри, в чём разница, а то голова кругом идёт:

Штука Core Data Нормальная база (типа SQLite)
О чём думает Объекты, связи, кто кому отец Таблицы, строчки, циферки — всё чётко и скучно
Чем занимается Жизнью объектов в памяти следит, как наседка, связи строит, в файл сбрасывает Данные хранит и отдаёт по первому требованию, без души
Как спрашиваешь NSFetchRequest с NSPredicate (типа "эй, Джон, выйди, сука, отсюда!") SQL (типа "SELECT * FROM users WHERE name='John'", всё серьёзно)
Что в памяти Всё видит, всё помнит, может откатить, если накосячил Плевать хотел, пока ты явно не скажешь "UPDATE"

Вот, например, как у него Джона найти:

let request: NSFetchRequest<User> = User.fetchRequest()
request.predicate = NSPredicate(format: "name == %@", "John")
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let users = try? context.fetch(request)

Так когда же эту Core Data впендюривать в проект?

  • Если ты, как истинный адепт культа Apple, живёшь по канонам MVC и хочешь, чтобы всё было "как у людей".
  • Если у тебя там объекты друг за друга цепляются, как пьяные друзья после пятницы — один-ко-многим, многие-ко-многим, овердохуища связей.
  • Если нужна волшебная кнопка "отмена" или чтобы схема данных эволюционировала, не взрывая всё к хуям собачьим.

А когда лучше взять голый SQLite и не париться?

  • Когда производительность — это святое, и тебе нужно, чтобы десять JOIN'ов отрабатывали быстрее, чем я это предложение выговорил.
  • Когда структура данных проще, чем у этого текста, и городить целый объектный граф — это как из пушки по воробьям.
  • Когда ты, блядь, контроль-фрик и хочешь сам каждый SQL-запрос написать, чтобы знать, что ни одна строчка не уйдёт на лево.