FetchControllers 中的自定义排序描述符

Posted

技术标签:

【中文标题】FetchControllers 中的自定义排序描述符【英文标题】:Custom Sort Descriptor in FetchControllers 【发布时间】:2013-07-15 10:07:22 【问题描述】:

我在核心数据中有一个事件实体 具有 eventName、eventDate、eventLocation 属性。我正在使用 SortDescriptors 作为 key eventDate。我在这里有一个问题,我需要设置位置首选项,我需要根据位置而不是键而是值来排序。例如,假设我将位置设置为“西雅图”,而不是所有具有西雅图位置的事件都应首先显示。您知道如何使用 FetchControllers 执行此操作吗?请在回答之前阅读问题

我不想

[NSSortDescriptor sortDescriptorWithKey:@"eventLocation" ascending:YES];

但是像

[NSSortDescriptor sortDescriptorWithKey:@"eventLocation==Seattle" ascending:YES];

(这是错误的,我知道这是谓词格式)

【问题讨论】:

所有事件都是数组或字典数组? @RanjuPatel no not in array m using fetch controllers for table view 我希望委托方法也能正常工作..Db 不是静态的 ***.com/questions/1071765/… @RanjuPatel 我不认为那是我的问题的答案。我知道 fetch Request 不允许使用 Objective C 排序描述符...我想像 preicates 那样做,但其他人应该也低于我的想要的 【参考方案1】:

@sheetal,您的情况类似于 iPhone 中的电话应用程序,其中联系人按姓氏升序排序,但 # 必须出现在最后(Z 下方)。换句话说,我们首先要 A B ... Z,然后是 #。

顺便说一句,# 代表那些以其他字符开头的姓氏,例如@myHome、133isACat、#puppy 等。要获取部分,我们可以创建一个名为 lastNameInitial 的新 Transient 属性并将其作为 SectionNameKeyPath 提供。如果 isLastNameNumeric(定义如下)为 YES,则分配 lastNameInitial = @"#"。否则,将 Last Name 的第一个字母,例如 A、B 等,分配给 lastNameInitial。

如果我们在排序描述符数组中使用单个排序描述符,即基于姓氏升序的排序描述符,那么我们将在 A 之前以 # 开头。为了解决这个问题,我们可以定义一个名为 isLastNameNumeric 的瞬态属性( BOOL),对于“常规”姓氏(以 A B ... Z 开头)为 0,对于所有其他姓氏(例如 @myHome)为 1。根据 isLastNameNumeric Ascending 创建一个单独的排序描述符,并将其作为数组中的第一个排序描述符。将 Last Name Ascending 排序描述符设置为第二个排序描述符,它将根据姓氏进行子排序。

重申一下,基于 isLastNameNumeric Ascending 的排序描述符仅用作不可见的助手。

类似的解决方案将适用于您。但是,如果您的 eventLocation 可以更改(并不总是西雅图),那么实施此解决方案可能会比较棘手。

如果有人有更好的主意,无论是先显示 A B ... Z 再显示 #,还是对于 @sheetal 的情况,我都会全力以赴。

【讨论】:

我设法按照@J Sreedhar 的建议实现了 Phone.app 样式索引。一切正常,除了他忘了提到如果您使用 SQLite 存储,则无法在瞬态属性上添加排序描述符。为此,我创建了普通的布尔属性,并在设置另一个属性时将其设置为临时属性。稍后将发布代码示例,因为它仍在开发中。

以上是关于FetchControllers 中的自定义排序描述符的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController 中的自定义排序

Drupal 视图中的自定义排序

STL中的自定义排序

pyspark 数据框中的自定义排序

Android:SQLite 中的自定义排序规则

SOLR查询过滤结果中的自定义排序?