我有一个CoreDataTableViewController的子类(由斯坦福大学的人们完成的UITAbleViewController圆的子类,用于链接CoreData和TableViews)。在这个类上,我想执行一个fecth,通过一个名为“definition”的属性进行排序,执行它的代码如下:
- (void)setupFetchedResultsController{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:self.entity];
request.propertiesToFetch=[NSArray arrayWithObject:@"definition"];
request.returnsDistinctResults=YES;
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"%K != nil", @"definition"];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"%K != ''", @"definition"];
NSPredicate *predicate3= [NSPredicate predicateWithFormat:@"%K contains[cd] %@", @"definition", self.seachBar.text];
NSArray *prepredicateArray;
if ([self.seachBar.text length]) {
prepredicateArray = [NSArray arrayWithObjects:predicate1, predicate2, predicate3,nil];
}else {
prepredicateArray = [NSArray arrayWithObjects:predicate1, predicate2,nil];
}
request.predicate=[NSCompoundPredicate andPredicateWithSubpredicates:prepredicateArray];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"definition" ascending:YES ]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
[self performFetch];
}
如果我理解正确,请设置request.returnsDistinctResults = YES;应避免重复获取。但它不起作用,我看到这个属性值的重复。
那里有什么我想念的吗?我很欣赏那里的一些指点。提前谢谢。
编辑:如果有人在这里遇到同样的问题,在应用David的答案之后,生成的fetchedResultsController只是一个NSDIctionary,其对象只有请求的值,仅用于显示目的是非常好的。我在cellForRowAtIndexPath中为了在单元格标签上显示结果而做的一件事是:
之前:
HNMR *hnmr = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text=hnmr.definition;
后:
cell.textLabel.text=[[self.fetchedResultsController objectAtIndexPath:indexPath] valueForKey:@"definition"];
答案 0 :(得分:13)
来自documentation of returnsDistinctResults
:
仅当为
propertiesToFetch
设置了值时才使用此值。
来自documentation of propertiesToFetch
:
仅当
resultType
设置为NSDictionaryResultType
时才会使用此值。
来自documentation of resultType
:
默认值为
NSManagedObjectResultType
。
这一切都告诉我propertiesToFetch
被忽略了,因为你没有自己设置resultType
而默认它是返回托管对象而不是字典。由于propertiesToFetch
被忽略,returnsDistinctResults
也会被忽略,因此您仍然会获得重复项。
尝试设置结果类型以返回字典而不是托管对象。
request.resultType = NSDictionaryResultType;
答案 1 :(得分:6)