从 fetchedResultsController fetchedObjects 中移除一个对象
Posted
技术标签:
【中文标题】从 fetchedResultsController fetchedObjects 中移除一个对象【英文标题】:removing an object from a fetchedResultsController fetchedObjects 【发布时间】:2013-04-05 08:14:18 【问题描述】:是否可以从 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
我该怎么做?
【问题讨论】:
是要删除对象还是只是将其从结果中删除? @Svena 我只想从结果中删除它 【参考方案1】:从数据存储中删除对象:
[self.managedObjectContext deleteObject:object];
[self.managedObjectContext save:nil];
[self.fetchedResultsController self.fetchedResultsController.fetchRequest];
[tableView reloadData];
要从获取的结果控制器数组中删除对象,您需要更改谓词。确保禁用缓存(或更改缓存名称)以使其正常工作。
【讨论】:
【参考方案2】:我认为您可以定义一个“排除”属性或类似整数类型的属性,并将该属性合并到您的获取请求谓词中。现在,当您将报价标记为已排除时,获取的结果控制器将为您完成所有繁重的工作,而无需重新获取。
更新 #1
在这里解决更大的问题,我认为在获取的结果控制器谓词中使用子查询是更好的主意。
尝试使用:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(quotes, $x, $x.pack.packName IN %@).@count > 0", allowedPackNames];
作为获取结果控制器的获取请求的谓词,忘记手动过滤。
基本上,这个子查询应该为您做的就是过滤掉所有引用计数符合您的 packName 标准的作者。我承认我没有测试这个查询。如果您说这对您不起作用,我会自己解决问题并进行测试。
【讨论】:
您能否先详细解释一下您要做什么。您的问题非常直截了当,但我想了解您正在解决的整个问题。 试图获取所有带引号的作者,其中每个 Quote 对象在 allowedPackName 数组中都有一个带有 packName 的包。 更新了我的答案以适合您的问题。 这不起作用'未实现的谓词 SQL 生成:($x.packName IN "success, happy, free, business, dreamlove, change")' 这里真的需要子查询吗?我认为更简单的“ANY quotes.pack.packName IN %@”应该可以,将我的答案 ***.com/a/15829628/1187415 与您的其他问题进行比较。以上是关于从 fetchedResultsController fetchedObjects 中移除一个对象的主要内容,如果未能解决你的问题,请参考以下文章