核心数据错误:对于特定语言(例如泰语),“对象必须按部分名称排序”

时间:2014-04-29 10:34:40

标签: ios iphone core-data nsfetchedresultscontroller

  

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];
}

有什么建议吗?

2 个答案:

答案 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>