在Objective-C中更新Core Data中所有或某些托管对象的值的最有效方法是什么

时间:2010-10-19 20:30:03

标签: iphone objective-c core-data managed

我已经Google搜索并进行了研究,但无法找到在我的数据模型中迭代所有或某些托管对象的最佳方法,并在每种情况下更新属性值,在我的情况下,更新到当前日期。托管对象上下文和持久性存储委托方法都在我的Application Delegate中。我可以在程序的表视图中添加一些代码,但我觉得调用方法来更新这些值会更有效,因为它们可能不一定会返回到表视图。

最终,我想在我的应用程序的任何地方循环遍历我的托管对象并更新值。

如果您需要更多信息,请与我们联系。谢谢!

-COY

3 个答案:

答案 0 :(得分:11)

根据要更新值的内容,您可以获取对象数组并在数组上调用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];

设置获取请求应该只需要你想要的实体,保留谓词为零,这样你就可以恢复所有实例。

答案 1 :(得分:6)

从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/

答案 2 :(得分:5)

更新多个对象的唯一方法是拥有所有这些对象。没有办法像在SQL中那样使用Core Data进行“批量更新”,因为 Core Data不是数据库。它是一个对象图持久性框架,这意味着你将处理对象。

您可以采取一些措施来降低内存使用率(例如批量获取请求并仅获取某些属性),但最终您将使用循环并逐个更新对象。