0

在我的核心数据实体“书”上,我有一个布尔属性“wasViewed”(NSNumber numberWithBool),它告诉我这本书是否被“查看”。

我想为我所有的 NSManagedObjects“书”实现一种“重置”这个属性。这样我就可以在会话之间将它们全部设置为 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];

这工作得很好,但是,现在我需要设置一个循环,遍历每个 Book 对象,如下所示:

for(Book *b in mutableFetchResults) {

    [b setWasViewed:NO]
}

有没有办法对适合谓词的每个元素执行操作而不是检索它?因此,不是executeFetchRequestmanagedObjectContext它可能是 executeOperationOnFetchRequestResults或类似的东西。

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

4

1 回答 1

1

Core Data 不提供那种便利的功能。为了更新对象集,您需要“手动”进行。如果您担心代码行数,可以将示例压缩为:

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

您还可以将您的“wasViewed”属性更改为“lastViewed”之类的东西,它是一个 NSDate。无需将图书标记为已查看,您只需将“lastViewed”更新为当前时间。然后,您可以通过检查书籍“lastViewed”时间是否大于会话开始时间来确定是否在当前会话中查看了一本书。

于 2010-04-21T14:57:24.250 回答