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

Mus*_*afa 3 sorting core-data nssortdescriptor nsfetchrequest ios

我有一个NSEntity(Cloth)与属性(type这是从预定义的列表填充的)NSString值,即雨披,夹克,外套,袍子,顶,西服等

我想获取所有Cloth记录,以便根据已定义的顺序对记录进行排序type.即所有的雨披记录都在上面,然后是夹克,然后是外套,然后是礼服,然后是Top,然后是西装等.

Poncho? …
Poncho? …
Poncho? …
Jacket … 
Jacket … 
Coat …
Coat …
Coat …
Gown …  
Gown …  
Top …
Top …
Top …
Top …
Suit …  
Suit … 
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*n R 7

核心数据获取请求只能对存储在SQLite数据库中的属性进行排序(请参阅"核心数据编程指南"中的获取受管对象获取谓词和排序描述符.)

您有以下选择:

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

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

  • 取而代之的存储类型为字符串的属性,你可以定义另一个实体Type拥有的属性nameorder和的关系type,从ClothType.在这种情况下,您可以对关键路径进行排序type.order.

  • 核心数据不公开排序功能肯定可以添加到该页面...... (2认同)

Mun*_*ndi 5

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

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

如果您确实希望将此逻辑与其余数据分开,则可以创建ClothType具有属性的新实体,namesortOrder与您的Cloth实体建立关系.

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