В чем разница между Keychain и Core Data?

«В чем разница между Keychain и Core Data?» — вопрос из категории Базы данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Keychain — это системное безопасное хранилище для небольших битов конфиденциальной информации. Core Data — это фреймворк для управления графом объектов и их сохранения (объектно-реляционное отображение, ORM).

Аспект Keychain Core Data
Основная цель Безопасное хранение секретов (пароли, ключи, сертификаты). Моделирование, хранение и запросы структурированных данных приложения.
Модель данных Пары «ключ-значение» или небольшие бинарные данные. Сложная объектная модель с отношениями (один-ко-многим, многие-ко-многим).
Запросы Только поиск по атрибутам (аккаунт, сервис). Мощный язык запросов (NSPredicate), сортировка (NSSortDescriptor).
Стойкость данных Сохраняется между установками приложения. Обычно удаляется с приложением (хранится в sandbox).
Бэкенд Зашифрованное системное хранилище. SQLite, XML, бинарный формат или только в памяти (In-Memory).
Миграция схемы Нет. Данные сохраняются «как есть». Есть, поддерживаются автоматические и ручные миграции.

Пример Core Data:

// 1. Определяем сущность `User` в модели данных.
// 2. Сохраняем объект.
let context = persistentContainer.viewContext
let newUser = UserEntity(context: context)
newUser.id = UUID()
newUser.name = "John Doe"
newUser.email = "john@example.com"
// Токен НЕ следует хранить в Core Data. Используйте Keychain.
// newUser.token = "secret" // ❌ Плохая практика

do {
    try context.save()
} catch {
    print("Ошибка сохранения: (error)")
}

// 3. Запрос (Fetch) данных.
let fetchRequest: NSFetchRequest<UserEntity> = UserEntity.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", "John Doe")
let users = try? context.fetch(fetchRequest)

Вывод: Используйте Keychain для секретов. Используйте Core Data (или Realm, SQLite.swift) для хранения основной структурированной информации вашего приложения (пользователи, посты, настройки).