import CoreData
CoreData - нативный фреймворк, предназначенный для хранения данных. Фреймоврк изначально доступный для использования в проектах и импортируется с помощью команды:
Для использования CoreData в проекте необходимо настроить соответстввующее окружение. Для этого необходимо выполнить два шага:
- Добавить файл с моделью данных, после чего настроить модель.
- Реализовать интерфейс доступа к контексту.
Для создания модели данных вы можете использовать один из следующих методов:
- При создании проекта отметить галочку
use CoreData. - В составе проекта создать новый файл типа
Data Model.
В результате в Project Navigator отобразится файл AppName.xcdatamodeld, где AppName соответствует имени проекта.
Для доступа к контексту вы можете использовать один из следующих методов:
- При создании проекта отметить галочку
use CoreData, в результате чего в классеAppDelegateпоявится свойствоpersistanceContainer. - Реализовать доступ к Persistance Container самостоятельно в произвольном месте проекта с помощью кода:
let persistanceContainer = NSPersistentContainer(name: "AppName")
persistanceContainer.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})После этого вы сможете получить доступ к контексту через свойство viewContext:
persistanceContainer.viewContextВсе операции с CoreData производятся с помощью контекста. В приложении одновременно может существовать произвольное количество контекстов, но обычно вам должно хватить одного.
let context = persistanceContainer.viewContextДля получения данных используются значения следующих типов:
NSFetchRequest- описывает критерии поиска значений в хранилище.
// Формируем запрос на загрузку данных
// Будут загружены все записи с именем EntityName
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "EntityName")
do {
let entities = try context.fetch(fetchRequest)
// теперь в entities содержатся полученные из хранилища элементы
// типа EntityName
// мы можем необходимым образом обработать их
} catch {
fatalError("Error message: \(error)")
}Для удаления данных используются следующие типы данных:
NSBatchDeleteRequest- описывает запрос для пакетного удаления данных без необходимости их загрузки из хранилища.
// будут удалены все записи типа EntityItem
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "EntityItem")
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try context.execute(batchDeleteRequest)
try context.save()
} catch {
fatalError("Error message: \(error)")
}let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "EntityItem")
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
// указываем тип возвращаемого значения
// в данном случае - это количество удаленных записей
batchDeleteRequest.resultType = .resultTypeCount
do {
let result = try context.execute(batchDeleteRequest) as! NSBatchDeleteResult
try context.save()
// выводим на консоль количество удаленных записей
print(result.result ?? 0)
} catch {
fatalError("Error message: \(error)")
}let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "EntityItem")
// будут удалены записи, у которых в поле id содержится значение 3
fetchRequest.predicate = NSPredicate(format: "id = %@", 3)
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try context.execute(batchDeleteRequest)
try context.save()
} catch {
fatalError("Error message: \(error)")
}