避免在核心数据提取上出现重复结果

时间:2012-06-27 19:43:40

标签: xcode core-data nspredicate nsmanagedobject nsfetchrequest

我有一个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"];

2 个答案:

答案 0 :(得分:13)

来自documentation of returnsDistinctResults

  

仅当为propertiesToFetch设置了值时才使用此值。

来自documentation of propertiesToFetch

  

仅当resultType设置为NSDictionaryResultType时才会使用此值。

来自documentation of resultType

  

默认值为NSManagedObjectResultType


这一切都告诉我propertiesToFetch被忽略了,因为你没有自己设置resultType而默认它是返回托管对象而不是字典。由于propertiesToFetch被忽略,returnsDistinctResults也会被忽略,因此您仍然会获得重复项。

尝试设置结果类型以返回字典而不是托管对象。

request.resultType = NSDictionaryResultType;

答案 1 :(得分:6)

除了DavidRönnqvist之外,我建议使用核心数据选择不同的值时提供一个有用的链接(带有示例):

core-data-how-to-do-a-select-distinct

希望有所帮助。