如何按相关属性对获取请求进行排序?

How to sort fetch request by related properties?

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

联系人可以有几个 phone 号码,我需要按 PhoneNumbers 属性 对 Contacts 进行排序,我想按现有的 [=15] 对它进行排序=] registered 属性 中的值,例如:

Contact1
  prop1 = "value1"
  prop2 = "value2"
  PhoneNumbers = [
    {prop1 = "value1", prop2 = "value2", registered = false},
    {prop1 = "value1", prop2 = "value2", registered = false}
  ]

Contact2
  prop1 = "value1"
  prop2 = "value2"
  PhoneNumbers = [
    {prop1 = "value1", prop2 = "value2", registered = false},
    {prop1 = "value1", prop2 = "value2", registered = false},
    {prop1 = "value1", prop2 = "value2", registered = true}
  ]

Contact3
  prop1 = "value1"
  prop2 = "value2"
  PhoneNumbers = [
    {prop1 = "value1", prop2 = "value2", registered = false},
    {prop1 = "value1", prop2 = "value2", registered = false}
  ]

Contact2PhoneNumberregistered = 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:) 获取所有值并对其进行排序不是解决方案 - 太多联系人会冻结应用程序

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

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

The supported sort selectors for SQLite are compare: and caseInsensitiveCompare:, localizedCompare:, localizedCaseInsensitiveCompare:, and localizedStandardCompare:.

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