2016-08-05 43 views
0

我有两个CoreData实体与一个一对多的关系 - Contact(主)和PhoneNumber(相关)如何对相关属性的提取请求进行排序?

联系人可以有多个电话号码,我需要通过PhoneNumbers属性进行排序Contacts,我要排序它通过在registered物业现有true值,例如:

 
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} 
    ] 

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:即使参数类型是否正确

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

比较(NSSortDescriptor sortDescriptorWithKey:ascending:comparator:)不被NSFetchRequest
支持获取所有值数组和排序是不是一个解决方案 - 太多的接触可以冻结申请

回答

0

您不能对一个一对多的关系。每个联系人可能有多个PhoneNumbers;要决定哪个联系人先来,CoreData需要每个联系人的单个值。

你的第二个错误是因为registeredCompare不是一个公认的排序选择器。从Core Data Programming Guide

SQLite的支持的种类选择的比较:和caseInsensitiveCompare :, localizedCompare :, localizedCaseInsensitiveCompare:和localizedStandardCompare :.

一个解决方案,您的问题将是一个布尔属性添加到Contact实体,说hasRegisteredPhoneNumber您更新到真或假,当你添加/修改/删除相关PHONENUMBERS。然后使用该新属性作为排序关键字。

相关问题