Xcode 避免获取核心数据时出现重复结果

Xcode 避免获取核心数据时出现重复结果,xcode,core-data,nspredicate,nsmanagedobject,nsfetchrequest,Xcode,Core Data,Nspredicate,Nsmanagedobject,Nsfetchrequest,我有一个CoreDataTableViewController的子类(斯坦福大学的人们为了链接CoreData和TableView而创建的UITAbleViewController dome的子类)。在这个类上,我想执行一个fecth,通过一个名为“definition”的属性进行排序,执行它的代码如下: - (void)setupFetchedResultsController{ NSFetchRequest *request = [NSFetchRequest fetchRequ

我有一个CoreDataTableViewController的子类(斯坦福大学的人们为了链接CoreData和TableView而创建的UITAbleViewController dome的子类)。在这个类上,我想执行一个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"];
之后

HNMR *hnmr = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text=hnmr.definition;
cell.textLabel.text=[[self.fetchedResultsController objectAtIndexPath:indexPath] valueForKey:@"definition"];
从:

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

从:

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

从:

默认值为
NSManagedObjectResultType


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

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

request.resultType = NSDictionaryResultType;

除了回答David Rönnqvist之外,我还建议一个有用的链接(带有一个样本),用于选择具有核心数据的不同价值:


希望能有所帮助。

谢谢大卫!我不知道在取回上的这些选项,它们真的很有趣。谢谢如果您使用NSDictionaryResultType,则无需设置returnsDistinctResults。如果未设置returnsDistinctResults,我不会得到重复的结果。@Jeff这很奇怪,因为根据文档,默认值是
NO