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

Coy*_*Coy 7 iphone managed core-data objective-c

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

最终,我希望在我的应用程序的任何位置循环遍历我的托管对象并更新值.

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

-COY

ImH*_*its 11

根据要更新值的内容,可以获取对象数组并在数组上调用setValue:forKey :,这将设置数组中每个对象的值.例如:

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

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

  • 我怎么能用Swift做到这一点?你知道如何更新数组中的所有对象吗? (3认同)

new*_*der 6

从iOS 8和OS X 10.10(Yosemite)开始,Apple在Core Data中添加了一个用于执行批量更新的新类:NSBatchUpdateRequest.它比使用a的解决方案更有效NSFetchRequest,特别是在处理大量数据时.这是一个基本的例子:

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

这里有一篇关于这个主题的好文章:https://www.bignerdranch.com/blog/new-in-core-data-and-ios-8-batch-updating/.


Dav*_*ong 5

更新多个对象的唯一方法是拥有所有这些对象.由于Core Data不是数据库,因此无法像在SQL中那样使用Core Data进行"批量更新" .它是一个对象图持久性框架,这意味着您将处理对象.

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