在iPhone上,Core Data是否有办法为其存储的实体的每个实例批量更新字段?像
这样的东西更新some_entities设置some_count = 0其中some_count> 0
或者我只需要实例化每个实体,设置值,然后保存它? (如果这就是答案,我怎么能在单个事务中做到这一点,假设该集合太大而无法适应内存?)
答案 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术语思考的人来说,核心数据肯定会令人沮丧。