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

Core data 在FetchedResults集中的每个结果上设置属性值,core-data,nspredicate,nsmanagedobjectcontext,Core Data,Nspredicate,Nsmanagedobjectcontext,在我的核心数据实体“Book”上,我有一个布尔属性“waseview”(NSNumber numberWithBool) 这告诉我这本书是否被“看过” 我想为我的所有NSManagedObjects“Book”实现一种“重置”此属性的方法。这样我可以在会话之间将它们全部设置为NO。 我使用NSPredicate检索所有书籍,如下所示: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"wasViewed == %@", [NS

在我的核心数据实体“Book”上,我有一个布尔属性“waseview”(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]
}
这很好,但是,现在我需要设置一个循环,遍历每个循环 Book对象,类似以下内容:

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]
}
是否有一种方法可以对符合谓词的每个元素执行操作,而不是检索谓词? 因此,在
managedObjectContext
上,它可以代替
executeFetchRequest
executeOperationOnFetchRequestResults
或类似的内容


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

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

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

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

Hi CJ谢谢,我最关心的是必须获取结果,除了将单个属性设置为true之外,我不需要其他任何东西。我希望有像makeObjectsPerformSelector这样的东西来获取。但我想这会偏离你通常使用核心数据的方式。获取和对象,更改它,保持它。我很喜欢你的“一行”,它和循环一样容易阅读,而且更紧凑。我确实有一个“lastViewed”日期,这个日期只适用于一些特殊情况,这也是为什么我不喜欢为它“保留”bot获取和循环:)。还是好建议!