使用 NSFetchedResultsController 排序时如何忽略前缀“A”和“The”?

Posted

技术标签:

【中文标题】使用 NSFetchedResultsController 排序时如何忽略前缀“A”和“The”?【英文标题】:How to ignore prefixes "A" and "The" when sorting using NSFetchedResultsController? 【发布时间】:2012-01-20 21:18:52 【问题描述】:

我正在使用 CoreData 来保存保存在 SQLite 数据库中的书籍信息。按标题排序时,我想忽略“A”和“The”前缀。例如,当有书:“密码书”和“费马之谜”时,我希望“费马之谜”排在“密码书”之前,因为“The”应该被忽略。

除了添加一个不带前缀的标题的持久属性之外,我找不到任何方法来做到这一点。 (在上面的示例中,该属性说“titleNoPrefixes”应该包含“Code Book”字符串)。在 CoreData 中,基于计算的属性(又名瞬态属性)进行排序似乎是不可能的。

添加持久属性显然是一种糟糕的数据库设计,但我看不到另一种方法。有什么建议吗?

【问题讨论】:

【参考方案1】:

约书亚,

您的问题几乎与 Core Data 作为持久存储无关,这是对文本问题的一般数据库排序。解决问题的传统方法是使用普通表单字段作为排序类别。您可能希望将所有内容都小写并去掉该字段的干扰词。由于这些只是标题,因此在存储方面并不是特别昂贵。此外,这是插入时间操作而不是搜索时间操作。最后,瞬态变量只存在于 RAM 中。我相信它们在数据存储区中是 NULL 值。因此,对它们进行搜索毫无意义并引发异常。

安德鲁

【讨论】:

【参考方案2】:

您可以编写自己的 NSString 类别来实现:

    创建删除文章的 NSString 副本(假设您要保留原始字符串) 比较从 #1 返回的字符串。

【讨论】:

我猜你的意思是 NSString 类别应该实现一个比较操作,比如(NSComparisonResult)ignorePrefixesCompare:(NSString *)string。对?如果这就是你的意思,我试过了,CoreData 忽略了它。原因在这里描述***.com/questions/4789782/… @Joshua 似乎要采用持久性属性,因为无法对 SQLite 存储上的瞬态数据进行排序。 好吧,我想这些是没有别的办法了。感谢您的回复!

以上是关于使用 NSFetchedResultsController 排序时如何忽略前缀“A”和“The”?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?