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

4
我正在使用CoreData持有保存在SQLite数据库中的书籍信息。当按标题排序时,我想忽略“A”和“The”前缀。例如,当存在书籍:“The Code Book”和“Fermat's Enigma”时,我希望“Fermat's Enigma”排在“The Code Book”的前面,因为应该忽略“The”。除了添加一个持久化属性来保持没有前缀的标题(在上面的示例中,该属性称为'titleNoPrefixes',应持有字符串“Code Book”),似乎找不到其他方法来做到这一点。在CoreData中,基于计算属性(又名瞬态属性)进行排序似乎是不可能的。
显然,添加一个持久化属性是不好的数据库设计,但我看不到其他办法。有什么建议吗?
2个回答

1

你可以编写自己的NSString类别,实现以下功能:

  1. 创建一个副本,删除其中的文章(假设您想保留原始字符串)
  2. 比较从#1返回的字符串。

我猜你的意思是,NSString类别应该实现一个比较操作,类似于(NSComparisonResult)ignorePrefixesCompare:(NSString*)string。 对吗?如果是这个意思,我尝试过了,但CoreData忽略了它。 原因在这里描述https://dev59.com/PlPTa4cB1Zd3GeqPlrI1 - Joshua
@Joshua,似乎持久属性是正确的选择,因为在 SQLite 存储中无法对瞬态数据进行排序。 - jcm
好的,我想没有其他办法了。感谢你们的回复! - Joshua

1

Joshua,

你的问题与Core Data作为持久存储几乎没有任何关系,这是一个通用的文本排序数据库问题。解决你的问题的传统方法是使用一个普通的表单字段作为排序类别。你可能想要将所有内容转换为小写并去除噪音词汇。由于这些只是标题,因此从存储角度来看并不特别昂贵。此外,这是一个插入时间操作而不是搜索时间操作。最后,瞬态变量仅存在于RAM中。在数据存储中,它们是NULL值。因此,在它们上面进行搜索是毫无意义的,并会引发异常。

安德鲁


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接