【问题标题】:How to sort fetch request by related properties?如何按相关属性对获取请求进行排序?
【发布时间】:2016-08-05 16:06:48
【问题描述】:

我有两个具有一对多关系的 CoreData 实体 - Contact(主要)和 PhoneNumber(相关)

联系人可以有多个电话号码,我需要按PhoneNumbers 属性对Contacts 进行排序,并且我想按registered 属性中存在的true 值对其进行排序,例如:

联系人1 道具1 =“价值1” 道具2 =“价值2” 电话号码 = [ {prop1 = "value1", prop2 = "value2", 注册 = false}, {prop1 = "value1", prop2 = "value2", 注册 = false} ] 联系人2 道具1 =“价值1” 道具2 =“价值2” 电话号码 = [ {prop1 = "value1", prop2 = "value2", 注册 = false}, {prop1 = "value1", prop2 = "value2", 注册 = false}, {prop1 = "value1", prop2 = "value2", 注册 = true} ] 联系方式3 道具1 =“价值1” 道具2 =“价值2” 电话号码 = [ {prop1 = "value1", prop2 = "value2", 注册 = false}, {prop1 = "value1", prop2 = "value2", 注册 = false} ]

Contact2 具有 PhoneNumberregistered = true,我想将其移至获取结果的顶部

我的排序描述符:

[NSSortDescriptor sortDescriptorWithKey:@"phoneNumbers" ascending:YES selector:@selector(registeredCompare:)];

当我指定phoneNumbers 键(作为数据模型中的关系)时,我收到错误Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'

当我将键更改为另一个时,即使参数类型正确,错误也会更改为unsupported NSSortDescriptor selector: registeredCompare:

如何按相关属性对数据进行排序?

NSFetchRequest 不支持比较器 (NSSortDescriptor sortDescriptorWithKey:ascending:comparator:)
获取所有值到数组并对其进行排序不是解决方案 - 太多的联系人可能会冻结应用程序

【问题讨论】:

    标签: sorting core-data relationship nssortdescriptor


    【解决方案1】:

    您不能按对多关系排序。每个联系人可能有多个电话号码;为了决定哪个联系人先出现,CoreData 需要为每个联系人提供一个值。

    您的第二个错误是因为registeredCompare 不是可识别的排序选择器。来自Core Data Programming Guide

    SQLite 支持的排序选择器是 compare: 和 caseInsensitiveCompare:、localizedCompare:、localizedCaseInsensitiveCompare: 和localizedStandardCompare:。

    您的问题的一个解决方案是向Contact 实体添加一个布尔属性,例如hasRegisteredPhoneNumber,当您添加/更改/删除相关的电话号码时,您将其更新为真或假。然后将该新属性用作排序键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多