0

情况:带有“联系人”实体和“总和”属性的 CoreData 数据库(正数或负数或 0)

目标:具有 3 个部分的 tableviewcontroller,第一个正面第二个负面第三个(零)“存档”

到目前为止:使用@selector(compare:) 对描述符进行排序(没有谓词,因为需要所有联系人的列表)

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];

request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"moneySum" ascending:YES selector:@selector(compare:)]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                    managedObjectContext:self.database.managedObjectContext
                                                                      sectionNameKeyPath:@"sectionName"
                                                                               cacheName:nil];

并在联系实体的类别中:

- (NSString *)sectionName {

    [self willAccessValueForKey:@"sectionName"];
    NSString *sectionName;
    double value = [[self valueForKey:@"moneySum"] doubleValue];

    if      (value > 0) sectionName = POS_SECTION;
    else if (value < 0) sectionName = NEG_SECTION;
    else                sectionName = ARCHIVE_SECTION;

    [self didAccessValueForKey:@"sectionName"];
    return sectionName;
}

我现在确实得到了 3 个类别,但它显然是在中间对它们进行排序,而不是在最后。

我考虑在 sortDescriptors 数组中添加第二个 sortDescriptor(在比较之前:一个),但对我来说最直观的方法(isEqualToNumber:) 显然不起作用,因为我无法指定任何参数(@selector (..:))还是我错了?

抱歉,这对整个编码来说都是全新的 :)

4

1 回答 1

1

来自“核心数据编程指南”:

...总而言之,如果您直接执行 fetch,则通常不应将基于 Objective-C 的谓词或排序描述符添加到 fetch 请求中。相反,您应该将这些应用于获取的结果。

这意味着您不能在获取请求中使用自定义排序描述符。您必须在实体中存储一个附加(非瞬态)属性,例如“0”、“1”、“2”用于正/负/零和。

然后,您可以将此属性用于排序描述符sectionNameKeyPath您不需要临时属性“sectionName”。

然后从“0”、“1”、“2”到实际节标题的映射在tableView:titleForHeaderInSection:.

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
    int order = [[sectionInfo name] intValue];
    if (order == 0)
        return @"POSITIVE SECTION";
    else if (order == 1)
        return @"NEGATIVE SECTION";
    else
        return @"ARCHIVE SECTION";
}
于 2012-08-17T13:03:56.803 回答