CoreData:error:(NSFetchedResultsController)索引72处的获取对象具有乱序部分名称“อั”。对象必须按节名'
排序
我使用以下代码按书名字段排序,并将显示书名称的第一个大写字母作为UITableViewController中的章节名称。
除泰语外,该代码在所有语言中都能完美运行。我在网上看到有特殊的非美国字符引起了这样的问题(即Æ),但我还没有找到任何解决方案。
请参阅The fetched object at index [i] has an out of order section name 'å
上的gschandler回复FRC代码
NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:@"titleFirstLetter"
cacheName:nil];
firstLetter的代码是:
- (NSString *)titleFirstLetter {
// support UTF-16:
NSString* val = [self.title substringWithRange:[self.title rangeOfComposedCharacterSequenceAtIndex:0]];
return [val uppercaseString];
}
有什么建议吗?
答案 0 :(得分:4)
您必须添加一个排序描述符,该描述符对sectionNameKeyPath所在的同一属性进行排序。
NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"titleFirstLetter" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sort,nil]];
[fetchRequest setFetchBatchSize:20];
答案 1 :(得分:0)
SwiftUI 3 的另一个示例:
@SectionedFetchRequest(sectionIdentifier: \.categoryName,
sortDescriptors: [NSSortDescriptor(keyPath: \Listing.category, ascending: false)],
predicate: NSPredicate(format: "%K = %d", #keyPath(Listing.isPublished), true),
animation: .default)
.categoryName 派生自 Listing.category 作为列表的扩展,如下所示:
extension Listing {
@objc var categoryName: String {
return self.category?.name ?? ""
}
}
但是,我收到一个错误,因为我试图通过 createdOn 对列表进行排序:
[NSSortDescriptor(keyPath: \Listing.createdOn, ascending: false)]
正如@BossBols 所说,节和主要项目的排序描述符必须相同。因此,对类别的列表进行排序是有效的。添加第二个分段排序可以实现我最初的预期行为。
@SectionedFetchRequest(sectionIdentifier: \.categoryName,
sortDescriptors: [NSSortDescriptor(keyPath: \Listing.category, ascending: false),
NSSortDescriptor(keyPath: \Listing.createdOn, ascending: false)],
predicate: NSPredicate(format: "%K = %d", #keyPath(Listing.isPublished), true),
animation: .default)
var listings: SectionedFetchResults<String, Listing>