2016-08-05 4 views
0

У меня есть две сущности CoreData с один-ко-многим - Contact (основной) и PhoneNumber (связанных)Как отсортировать запрос выборки по связанным свойствам?

Контакт может имеет несколько телефонных номеров, и мне нужно сортировать Contacts по PhoneNumbers собственности, и я хочу, чтобы отсортировать это существующим в true ценностей в 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} 
    ] 

Contact2 имеет PhoneNumber с registered = 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, который вы обновляете к истинному или ложному при добавлении/изменения/удалить связанные номера телефонов. Затем используйте этот новый атрибут в качестве ключа сортировки.