在我的核心数据实体“Book”上我有一个布尔属性,'wasViewed'(NSNumber numberWithBool) 这告诉我书是否被“查看”。
我想为我的所有NSManagedObjects“Book”实现一种“重置”这个属性。这样我就可以在会话之间将它们全部设置为NO。 我使用NSPredicate来检索所有这样的书:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"wasViewed == %@", [NSNumber numberWithBool:YES]];
// code for setting entity, request etc...
NSMutableArray *mutableFetchResults = [[[managedObjectContext executeFetchRequest:request error:&error] mutableCopy] autorelease];
这工作正常,但是,现在我需要设置一个循环,遍历每个 书籍对象,如下所示:
for(Book *b in mutableFetchResults) {
[b setWasViewed:NO]
}
有没有办法对符合谓词的每个元素执行操作而不是检索它?
因此,executeFetchRequest
上的managedObjectContext
可能不是executeOperationOnFetchRequestResults
{{1}}或类似的东西。
感谢您提供的任何输入:)
答案 0 :(得分:1)
核心数据不提供这种便利功能。要更新对象集,您需要“手动”执行此操作。如果您担心代码行数,可以将示例压缩为:
[mutableFetchResults makeObjectsPerformSelector:@sel(setWasViewed:) withObject:[NSNumber numberWithBool:NO]];
您还可以将'wasViewed'属性更改为类似'lastViewed'的NSDate。您只需将“lastViewed”更新为当前时间,而不是将图书标记为已查看。然后,您可以通过检查图书的“lastViewed”时间是否大于会话开始时间来确定当前会话中是否查看了图书。