核心数据获取请求的复杂排序

时间:2012-10-24 07:44:19

标签: ios sorting core-data nsfetchrequest nssortdescriptor

我有一个NSEntityCloth),其属性(type)是从预定义的NSString值列表中填充的,即雨披,夹克,外套,礼服,上衣,西装等

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

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

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

2 个答案:

答案 0 :(得分:7)

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

您有以下选择:

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

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

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

答案 1 :(得分:5)

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

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

如果您确实希望将此逻辑与其他数据分开,则可以创建一个包含ClothTypename属性的新实体sortOrder,并与您的{{{ 1}}实体。

另一种方案是将sort属性与每个“主要”类别相乘,例如10000,并为同一类别中的每个后续类别添加1。