0

Я создаю приложение, имеющее функциональность «контрольный список». Элемент контрольного списка хранится как объект Core Data. В Datamodel есть атрибут 'checked', который хранится как BOOL. Контроллер вида, обрабатывающий эту функциональность контрольного списка, основан на UITableViewController.Как изменить значение атрибута всех объектов в Core Data одновременно?

В принципе, я хотел бы реализовать UIRefreshControl, которые позволяют пользователям сбросить статус «проверено» всех объектов контрольного списка в Core Data. Например, все элементы будут сброшены и отображены как «не отмеченные», как только пользователь вытащит UITableView.

Однако NSFetchedResultsController обеспечивает доступ только к одному объекту за один раз через [fetchedResultsController objectAtIndexPath:indexPath]. Будет ли способ получить всю совокупность объектов из Core Data как NSArray или NSDictionary, поэтому я мог бы перечислить все сущности и изменить их атрибут «checked»?

ответ

1

Солидарен с coverback ... позволяет сказать, что вы хотите, чтобы извлечь все объекты из объекта с именем «Test»:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Test" 
              inManagedObjectContext:context]; 
NSError *error; 
[fetchRequest setEntity:entity]; 
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 

fetchObjects массив содержит все объекты в «Test» сущности

+0

Спасибо. Я сосредоточился на использовании NSFetchedResultsController и забыл, что можно получить весь объект непосредственно через сам управляемый объект. – Kann

+0

И тогда вы можете вызвать 'makeObjectsPerformSelector: withObject:' в массиве. Но это может занять некоторое время, если у вас много объектов в массиве. – newenglander

0

I необходимо было обновить множество объектов, поэтому решение с использованием NSFetchRequest было слишком медленным. К счастью, компания Apple добавила в NSBatchUpdateRequest прошивке 8. Вот простой пример:

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

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

Смежные вопросы