在FetchedResults集中的每个结果上设置属性值

时间:2010-04-21 09:50:33

标签: core-data nspredicate nsmanagedobjectcontext

在我的核心数据实体“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}}或类似的东西。

感谢您提供的任何输入:)

1 个答案:

答案 0 :(得分:1)

核心数据不提供这种便利功能。要更新对象集,您需要“手动”执行此操作。如果您担心代码行数,可以将示例压缩为:

[mutableFetchResults makeObjectsPerformSelector:@sel(setWasViewed:) withObject:[NSNumber numberWithBool:NO]];

您还可以将'wasViewed'属性更改为类似'lastViewed'的NSDate。您只需将“lastViewed”更新为当前时间,而不是将图书标记为已查看。然后,您可以通过检查图书的“lastViewed”时间是否大于会话开始时间来确定当前会话中是否查看了图书。