我正在开发一个核心数据驱动的应用程序,它有 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 属性指定是否为了排序目的而去除第一个单词之外,我看不出有什么办法。
对于剩下的问题,问题归结为......有没有一种方法可以在核心数据实体上创建一个(想知道更正确的术语)虚拟属性,当我将其名称作为NSFetchedResultsController
的 NSSortDescriptor
的键?
我宁愿不采用的绝望方法是在这 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/