Какой самый эффективный способ обновить значение всех или некоторых управляемых объектов в Базовых данных в Objective-C - PullRequest
7 голосов
/ 20 октября 2010

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

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

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Спасибо!

-Coy

Ответы [ 3 ]

11 голосов
/ 20 октября 2010

В зависимости от того, что вы хотите обновить значения, вы можете получить массив объектов и вызвать setValue: forKey: для массива, который установит значение для каждого объекта в массиве. e.g.:

//fetch managed objects
NSArray *objects = [context executeFetchRequest:allRequest error:&error];
[objects setValue:newValue forKey:@"entityProperty"];
//now save your changes back.
[context save:&error];

Для настройки запроса на выборку нужно просто указать нужную вам сущность, оставив предикат nil, чтобы вы вернули все экземпляры.

6 голосов
/ 03 июня 2016

Начиная с iOS 8 и OS X 10.10 (Yosemite), Apple добавила новый класс в Core Data для выполнения пакетных обновлений: NSBatchUpdateRequest.Это значительно более эффективно, чем решение, использующее NSFetchRequest, особенно при работе с большими объемами данных.Вот базовый пример:

NSBatchUpdateRequest *batchUpdate = [[NSBatchUpdateRequest alloc] initWithEntityName:@"EntityName"];
batchUpdate.propertiesToUpdate = @{ @"attribute": @(0) };
batchUpdate.resultType = NSStatusOnlyResultType;
[managedObjectContext executeRequest:batchUpdate error:nil];

И вот хороший пост в блоге на эту тему: https://www.bignerdranch.com/blog/new-in-core-data-and-ios-8-batch-updating/.

5 голосов
/ 20 октября 2010

Единственный способ обновить несколько объектов - это иметь все эти объекты.Невозможно выполнить «пакетное обновление» с Core Data, как вы можете в SQL, потому что Core Data не является базой данных .Это структура сохраняемости графов объектов, что означает, что вы будете иметь дело с объектами.

Существуют приемы, которые можно сделать, чтобы уменьшить использование памяти (например, пакетный запрос на выборку и выборочные свойства), но в конечном итогевы будете использовать цикл и обновлять объекты по одному.

...