2

是否可以从 fetchedResultsController fetchedObjects 中删除对象?

例如我有以下代码:

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pack.packName IN %@", allowedPackNames];
            for (int i = 0; i < [tempFetchResults.fetchedObjects count]; i++){
                Author *author = [tempFetchResults.fetchedObjects objectAtIndex:i];
                NSSet *filteredQuotes = [author.quotes filteredSetUsingPredicate:predicate];
                if ([filteredQuotes count] > 0){
                  author.quotes = filteredQuotes;
                } else {
                  //remove this author from the fetchedObjects array 
                }
            }

我怎样才能做到这一点?

4

2 回答 2

3

要从数据存储中删除对象:

[self.managedObjectContext deleteObject:object]; 
[self.managedObjectContext save:nil]; 
[self.fetchedResultsController self.fetchedResultsController.fetchRequest]; 
[tableView reloadData]; 

要从获取的结果控制器数组中删除对象,您需要更改谓词。确保禁用缓存(或更改缓存名称)以使其正常工作。

于 2013-04-05T08:21:54.143 回答
1

我认为您可以定义一个“排除”属性或类似整数类型的属性,并将该属性合并到您的获取请求谓词中。现在,当您将报价标记为已排除时,获取的结果控制器将为您完成所有繁重的工作,而无需重新获取所有内容。

更新#1

在这里解决更大的问题,我认为在获取的结果控制器谓词中使用子查询是更好的主意。

尝试使用:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(quotes, $x, $x.pack.packName IN %@).@count > 0", allowedPackNames];

作为获取结果控制器的获取请求的谓词,忘记手动过滤。

基本上,这个子查询应该为您做的就是过滤掉所有引用计数符合您的 packName 标准的作者。我承认我没有测试这个查询。如果您说这对您不起作用,我将自己解决问题并进行测试。

于 2013-04-05T08:27:20.460 回答