CoreData — обновление атрибутов без запроса данных или NSBatchUpdateRequest

Для изменения какого либо атрибута какой нибудь сущности мы обычно получаем ее из базы данных, изменяем атрибут и затем снова записываем, используя managedObjectContext.  Но представьте ситуацию, что вам надо изменить тысячу объектов в базе данных CoreData… Или десять тысяч…

Вышеупомянутый подход сработает и с миллионом записей в базе данных,  однако вы же понимаете, что он абсолютно не дружественнее к ресурсам системы, и времени, которое будет затрачено на выполнение обработки.

Начиная с  iOS 8,  Apple представила так называемые пакетные обновления (batch update) для базы данных CoreData.  Создавая экземпляр класса NSBatchUpdateRequest, мы указываем сущность, атрибут которой хотим обновить, и собственно сам атрибут с обновляемым значением.  Пример ниже:

//
//proSwift.ru

//  Изменение атрибутов в базе данных, без получения сущностей.
let batchUpdate = NSBatchUpdateRequest(entityName: "SomeEntity")
batchUpdate.propertiesToUpdate = ["someBoolProperty": NSNumber(bool: true)]
batchUpdate.affectedStores = coreDataStack.context.persistentStoreCoordinator!.persistentStores
batchUpdate.resultType = .UpdatedObjectsCountResultType

do {
    let batchResult = try coreDataStack.context.executeRequest(batchUpdate) as! NSBatchUpdateResult
    print("Записи обновлены \(batchResult.result!)")
    
} catch let error as NSError {
    print("не могу изменить \(error.localizedDescription)")
}

Добавить комментарий

Ваш адрес email не будет опубликован.

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.