【问题标题】:Core Data error: 'Objects must be sorted by section name' for specific languages such as Thai核心数据错误:特定语言(例如泰语)的“对象必须按部分名称排序”
【发布时间】:2014-06-15 05:53:43
【问题描述】:

CoreData: 错误: (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];
}

有什么建议吗?

【问题讨论】:

  • 我有完全相同的问题,除了泰语以外的所有语言都可以。您是否找到任何解决方法?是 gschandler 的方法最好吗?
  • 我最初使用 gschandler 的方法,因为我认为泰语是唯一有问题的语言......但是,当我发现德语中的某些字符也导致了这个问题时,我决定解决这个问题是必须。我的解决方案只是在 sqlite 数据库中添加一个“titleFirstLetter”字段,而不是在运行时获取该字段。这样,所有的排序工作都由 sqlite 数据库完成,并且不会出现冲突。就数据库设计而言,这当然不是最干净的解决方案,但这种解决方法非常有效。
  • 啊...现在我记得了,我在另一个使用 CoreData 的应用程序中遇到了一个类似的问题,并在运行时创建值,这最终导致了场外工作。似乎是最安全的方法。谢谢! :-)
  • 在我的情况下,我按字母顺序排序,但一个字段有一个不可见的换行符,导致为其计算错误的 sectionIndex。希望这对某人有所帮助。

标签: ios iphone core-data nsfetchedresultscontroller


【解决方案1】:

您必须添加一个排序描述符,该描述符对 sectionNameKeyPath 所做的相同属性进行排序。

NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"titleFirstLetter" ascending:NO];   
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sort,nil]];
[fetchRequest setFetchBatchSize:20];

【讨论】:

    【解决方案2】:

    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>
    

    【讨论】:

      猜你喜欢
      • 2012-08-22
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多