【问题标题】:Complex sorting for core-data fetch request核心数据获取请求的复杂排序
【发布时间】:2012-10-24 07:44:18
【问题描述】:

我有一个带有属性 (type) 的 NSEntity (Cloth),该属性是从预定义的 NSString 值列表中填充的,即雨披、夹克、外套、长袍、上衣、西装等。

我想获取所有 Cloth 记录,以便根据为 type 定义的顺序对记录进行排序。即所有 Poncho 的记录都在上面,然后是 Jacket,然后是 Coat,然后是 Gown,然后是 Top,然后是 Suit,等等。

Poncho‎ …
Poncho‎ …
Poncho‎ …
Jacket … 
Jacket … 
Coat …
Coat …
Coat …
Gown …  
Gown …  
Top …
Top …
Top …
Top …
Suit …  
Suit … 

这个顺序不是升序或降序,而是自定义的。如何获取 Cloth 记录,以便它们按此(定义的)顺序返回?

【问题讨论】:

    标签: ios sorting core-data nsfetchrequest nssortdescriptor


    【解决方案1】:

    Core Data 获取请求只能对存储在 SQLite 数据库中的属性进行排序(请参阅“Core Data 编程指南”中的Fetching Managed ObjectsFetch Predicates and Sort Descriptors。)

    您有以下选择:

    • 获取所有对象,然后使用自定义排序描述符对它们进行排序。但是,如果您将获取的结果控制器用于表格视图,这将无济于事。

    • Cloth 实体中存储一个额外的整数属性order 并将其用作排序键。这可能是最容易实现的一种,但您当然有一些冗余。

    • 您可以定义另一个实体Type,它具有属性nameorder,以及从ClothType 的关系type,而不是将类型存储为字符串属性。在这种情况下,您可以对键路径 type.order 进行排序。

    【讨论】:

    【解决方案2】:

    实现自定义订单的唯一方法是引入NSNumber 类型的新属性来跟踪订单。

    [似乎在类别字符串(Poncho 等)之后有更多文本,因此您实际上有许多唯一字符串都必须遵循自定义顺序,只是它们按第一个单词分组。]

    如果您真的想将此逻辑与其余数据分开,您可以创建一个新实体ClothType,其属性为namesortOrder,并与您的Cloth 实体建立关系。

    另一种方案是对每个“主要”类别的排序属性乘以 10000,然后为同一类别的每个后续类别加 1。

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 2014-03-24
      • 2018-12-05
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2018-02-11
      • 2019-11-06
      相关资源
      最近更新 更多