是否有核心数据中所有实体的批量更新操作?

时间:2009-11-09 21:23:44

标签: iphone core-data

在iPhone上,Core Data是否有办法为其存储的实体的每个实例批量更新字段?像

这样的东西

更新some_entities设置some_count = 0其中some_count> 0

或者我只需要实例化每个实体,设置值,然后保存它? (如果这就是答案,我怎么能在单个事务中做到这一点,假设该集合太大而无法适应内存?)

3 个答案:

答案 0 :(得分:7)

Core Data不提供此功能,但您可以使用Core Data托管对象的NSSet或NSArray的makeObjectsPerformSelector:withObject:方法。
将setter访问器作为选择器传递,将值作为对象传递。

例如,如果托管对象具有需要为所有人设置相同的属性“名称”:

[[fetchedResultsController fetchedObjects] makeObjectsPerformSelector:@selector(setName:) withObject:@"name for all"];

您不必拥有NSFetchedResultsController。您可以使用NSFetchRequest中的数组,甚至可以使用核心数据实体之间的多对多关系。

答案 1 :(得分:4)

核心数据不是数据库。如果要批量更新对象,则必须自己获取它们并更新值。

这样做的好方法是一次获取100个(使用NSFetchRequest设置fetchLimit),更新它们,然后保存托管对象上下文。泡沫,冲洗,重复直到所有物体都更新。

而且,正如Gerry建议的那样,如果您所做的更新很简单,您可以使用makeObjectsPerformSelector:在一行中进行更新。

答案 2 :(得分:2)

不,核心数据没有批量更新功能。如果您受内存限制,您可以考虑重新设计数据模型以简化操作;而不是为每个实体存储绝对计数,跟踪一组实体的主值并存储每个实体的该值的增量。

对于我们这些习惯于用SQL术语思考的人来说,核心数据肯定会令人沮丧。