objective-c - 我怎样才能做一个不区分大小写的 NSFetchedResultsController 类型,它也忽略像 "the"这样的词?

标签 objective-c ios sorting core-data

我正在开发一个核心数据驱动的应用程序,它有 2 个实体需要在 NSFetchedResultsController 中进行特殊排序。

更简单的情况 2 只需要忽略“The”,这样(我引用的是真实数据示例)种植节在排序顺序上排在 Peats Ridge 节之后。为了安全起见,我还想让这种排序不区分大小写。对于那个,我尝试了这里的建议 How can I sort an NSTableColumn of NSStrings ignoring "The " and "A "?通过添加...

@property (nonatomic, readonly) NSString * sortname;

到我的实体定义类的接口(interface)&...

- (NSString *)sortname
{
    NSMutableString *temp = [NSMutableString stringWithString:[[self name] lowercaseString]];
    if ([temp hasPrefix:@"the "]) {
        return [temp substringFromIndex:4];
    }
    return temp;
}

到实现但是当我给它 @"sortname" 作为 NSSortDescriptor 的键时应用程序崩溃了。

第二个实体更复杂。除了剥离“The”进行排序之外,还有“A”和敬语,如“Dr”和“Professor”,但并非总是如此。数据中的一个例子是 Ian Lowe 教授和 Wallace 教授的木偶剧院。 Ian Lowe 是一个真实存在的人(尽管我很尊重他)应该将 Ian 归入 I 之下,但没有 Wallace 教授,那只是一个木偶剧院的名字,它应该归入 P 之下。对于那个选择性它的一个方面,除了实体上的 bool 属性指定是否为了排序目的而去除第一个单词之外,我看不出有什么办法。

对于剩下的问题,问题归结为......有没有一种方法可以在核心数据实体上创建一个(想知道更正确的术语)虚拟属性,当我将其名称作为NSFetchedResultsControllerNSSortDescriptor 的键?

我宁愿不采用的绝望方法是在这 2 个实体上创建真正的 sortname 属性并在我填充实体时计算值。

更新... 尝试遵循 TechZen 的回答,这是我的 NSFetchedResultsController 的构造函数...

- (NSFetchedResultsController *)frc
{
    if (_frc) return _frc;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EventProfile"
                                              inManagedObjectContext:_moc];
    [request setEntity:entity];
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"name"
                                                           ascending:YES
                                                          comparator:^NSComparisonResult(id obj1, id obj2) {
        NSMutableString *sortname1 = [NSMutableString stringWithString:[obj1 lowercaseString]];
        if ([sortname1 hasPrefix:@"the "]) {
            sortname1 = [NSMutableString stringWithString:[sortname1 substringFromIndex:4]];
        }
        NSMutableString *sortname2 = [NSMutableString stringWithString:[obj2 lowercaseString]];
        if ([sortname2 hasPrefix:@"the "]) {
            sortname2 = [NSMutableString stringWithString:[sortname2 substringFromIndex:4]];
        }
        return [sortname1 compare:sortname2];
    }];

    [request setSortDescriptors:[NSArray arrayWithObject:sorter]];
    [sorter release], sorter = nil;
    [request setFetchBatchSize:15];

    NSFetchedResultsController *frcTemp = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                              managedObjectContext:_moc
                                                                                sectionNameKeyPath:nil
                                                                                         cacheName:[NSString GetUUID]];
    [self setFrc:frcTemp];
    [_frc setDelegate:self];
    [frcTemp release], frcTemp = nil;
    [request release], request = nil;

    if ([[_frc fetchedObjects] count] == 0) {
        //<#statements#>
    }

    return _frc;
}

但是它仍然是按名称排序。我插入了一个“我在这里”。比较器 block 中的日志行 & 没有出现在我的日志中,这让我认为比较器甚至没有被执行。

干杯 & TIA,佩德罗 :)

最佳答案

NSSortDescriptor 不接受 transient 属性。但有一个变通办法。

在 NSFetchedResultsController 中

将“sectionNameKeyPath”设置为过滤器,并将 NSSortDescriptor 保留为在核心数据中找到的真实列。 所以你的代码将是:

NSFetchedResultsController *fetcher = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                  managedObjectContext:context
                                                                    sectionNameKeyPath:@"sortname" 
                                                                             cacheName:nil];

关于objective-c - 我怎样才能做一个不区分大小写的 NSFetchedResultsController 类型,它也忽略像 "the"这样的词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7394875/

相关文章:

objective-c - 是否可以在 Storyboard 中创建静态 TableView 并稍后以编程方式添加它? (iOS5, XCode 4)

python - 如何按日志文件的信息对日志文件进行排序?

php - 我如何从 mysql 查询创建这个数组?

iphone - 以编程方式切换到横向模式,然后返回横向/纵向模式

objective-c - GLubyte 和 GL_UNSIGNED_BYTE 之间有区别吗?

objective-c - 如何创建字符串缓冲区以对其进行迭代并将类型 'String.CharacterView.Index' 的值转换为预期的参数类型 'Int' ?

linux Shell : Sort -k not working properly, 这是一个错误吗?

iphone - 使用自定义节标题将行添加到 tableView

ios - 适用于 iOS 5 的地理围栏 API

ios - Swift:UITableView - 滑动以删除 - 如何在滑动时让单元格内容不移动