如何按相关属性对获取请求进行排序?
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}
]
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:
如何按相关属性对数据进行排序?
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。然后将该新属性用作排序键。
我有两个具有一对多关系的 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} ]
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:
如何按相关属性对数据进行排序?
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。然后将该新属性用作排序键。