2

我有一个 CoreDataTableViewController 的子类(斯坦福大学的 UITableViewController 圆顶的子类,用于链接 CoreData 和 TableViews)。在这个类上,我想执行一个 fecth,按一个名为“定义”的属性进行排序,执行它的代码如下:

- (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; 应避免获取重复项。但是它不起作用,我看到此属性值的重复项。

那里有我想念的东西吗?我会很感激那里的一些指示。先感谢您。

编辑:如果有人在这里遇到同样的问题,在应用大卫的回答后,生成的 fetchedResultsController 只是一个 NSDIctionary ,它的对象只有请求的值,仅用于显示目的就很好了。为了在单元格标签上显示结果,我在 cellForRowAtIndexPath 中完成的一件事是:

之前

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

之后

cell.textLabel.text=[[self.fetchedResultsController objectAtIndexPath:indexPath] valueForKey:@"definition"];
4

2 回答 2

13

从以下文档returnsDistinctResults

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

从以下文档propertiesToFetch

此值仅在resultType设置为 时使用NSDictionaryResultType

从以下文档resultType

默认值为NSManagedObjectResultType


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

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

request.resultType = NSDictionaryResultType;
于 2012-06-27T20:04:45.107 回答
6

除了David Rönnqvist的回答之外,我还建议了一个有用的链接(带有示例),用于使用 Core Data 选择不同的值:

核心数据如何做一个选择不同

希望有帮助。

于 2012-06-27T20:08:44.890 回答