NSPredicate для фильтрации отношений - PullRequest
0 голосов
/ 25 июня 2018

Предположим, у меня есть сущности Персона и Домашнее животное, а также отношения один ко многим, поэтому у Персона есть список домашних животных.В настоящее время я могу фильтровать по возрасту питомца, используя этот предикат (как для Swift, так и для Objective-C для вашего удобства)

NSPredicate(format: "pets.age > 3")
[NSPedicate predicateWithFormat:@"pets.age > 3"]

, но это довольно неудобно и не очень надежно - поскольку сущность Pet может запрашиваться измногие другие сущности (например, доктор, другие родные братья и сестры, возможно, игрушки для домашних животных и т. д. - только для вашего воображения).

Что бы я хотел сделать:

NSPredicate(format: "pets MATCH %@", NSPredicate(format: "age > 3"))
[NSPedicate predicateWithFormat:@"pets MATCH %@", [NSPedicate predicateWithFormat:@"age > 3"]]

, чтобы я мог погладить животноесущность, чтобы дать мне правильный предикат для возраста, а затем использовать его в любых других предикатах.Как я могу заархивировать это?Я хотел бы использовать его на CoreData на устройстве iOS, поэтому довольно важно, какой SQL-запрос CoreData получит из него, потому что производительность имеет значение.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Не уверен, что я правильно понял, что вы хотите получить, но кажется, что вам нужны подзапросы. Взгляните здесь например

0 голосов
/ 25 июня 2018

Вы можете использовать %K в качестве ключевого заполнителя пути в строке предиката

NSPredicate(format: "%K > %@", "age", "3")

Таким образом, в зависимости от того, что вам нужно, у вас может быть несколько констант с различными операторами для использования при создании предикатов

let greaterThanPredicate = "%K > %@"
let equalPredicate = "%K = %@"

и т. Д. Или какой-то заводской класс, если ваши требования более сложные.

...