如何一次更改Core Data中所有实体的属性值?

时间:2013-02-18 12:33:35

标签: ios core-data nsfetchrequest nsfetchedresultscontroller

我正在构建具有“核对表”功能的应用程序。核对表项目存储为核心数据实体。在“数据模型”中还有一个“已检查”属性存储为BOOL。处理此核对表功能的视图控制器基于UITableViewController

基本上,我想实现UIRefreshControl,允许用户重置核心数据中所有核对表实体的“已检查”状态。例如,一旦用户下拉UITableView,所有项目都将被重置并显示为“未选中”。

但是,NSFetchedResultsController仅通过[fetchedResultsController objectAtIndexPath:indexPath]一次提供对一个实体的访问权限。是否有办法将核心数据中的整个实体集合作为NSArrayNSDictionary,因此我可以枚举所有实体并更改其“已检查”属性?

3 个答案:

答案 0 :(得分: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”实体

中的所有对象

答案 1 :(得分:0)

[fetchedResultsController fetchedObjects]可以很好地完成您的任务。

在这种情况下,也不需要使用NSFetchedResultsController,您可以使用简单的NSFetchRequest

答案 2 :(得分:0)

我需要更新很多实体,因此使用NSFetchRequest的解决方案太慢了。幸运的是,Apple在iOS 8中添加了NSBatchUpdateRequest。这是一个简单的例子:

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/