Core Data — это фреймворк Apple для управления графом объектов и сохранения их в персистентное хранилище. Это не база данных в классическом понимании, а скорее слой абстракции над хранилищем данных.
import CoreData
// Базовый стек Core Data
let container = NSPersistentContainer(name: "Model")
NSManagedObjectModel:
NSPersistentStoreCoordinator:
NSManagedObjectContext:
Сложные данные:
Локальная база данных:
Большие объемы данных:
Синхронизация между устройствами:
// Пример: Создание объекта
let newUser = User(context: context)
newUser.name = "Alex"
newUser.age = 30
// Сохранение
try context.save()
Производительность:
Функциональность:
Интеграция с iOS:
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { description, error in
if let error = error {
fatalError("Ошибка загрузки хранилища: \(error)")
}
}
return container
}()
Create:
let context = persistentContainer.viewContext
let newItem = Item(context: context)
newItem.timestamp = Date()
Read:
let request: NSFetchRequest<Item> = Item.fetchRequest()
request.predicate = NSPredicate(format: "timestamp > %@", yesterday as CVarArg)
let items = try context.fetch(request)
Update:
item.timestamp = Date()
try context.save()
Delete:
context.delete(item)
try context.save()
let request: NSFetchRequest<User> = User.fetchRequest()
request.predicate = NSPredicate(format: "age >= 18 AND name CONTAINS[cd] %@", "alex")
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
request.fetchLimit = 10
Критерий | Core Data | SQLite напрямую | Realm |
---|---|---|---|
Производительность | Высокая | Очень высокая | Высокая |
Кривая обучения | Крутая | Средняя | Пологая |
Поддержка Swift | Хорошая | Низкая | Отличная |
Мультитред | Сложная | Средняя | Простая |
iCloud Sync | Встроенная | Нет | Через MongoDB |
Модель данных:
Многопоточность:
perform
/performAndWait
для работы с контекстомОптимизация:
Обработка ошибок:
Использование в главном потоке:
Игнорирование миграций:
Утечки памяти:
Чрезмерное сохранение:
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
animation: .default)
private var items: FetchedResults<Item>
var body: some View {
List(items) { item in
Text("Item at \(item.timestamp!, formatter: itemFormatter)")
}
}
}
Core Data остается мощным инструментом в арсенале iOS-разработчика, особенно для сложных приложений с богатой локальной персистентностью.