Предикат CoreData с использованием отношений - PullRequest
1 голос
/ 26 марта 2019

У меня есть две сущности - Quotes и Customers. Один клиент может иметь много цитат. Отношения quotes и customers.

Я хочу получить объект цитаты на основе имени клиента и адреса электронной почты, отсортированный по дате, но я застрял, пытаясь отформатировать предикат ...

func getMostRecentQuote(name: String, email: String) -> Quotes? {
   var predicateList = [NSPredicate]()
   let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Quotes")
   let predicate1 = NSPredicate(format: "name CONTAINS[c] %@", name)
   let predicate2 = NSPredicate(format: "email CONTAINS[c] %@", email)
   let orCompoundPredicate = NSCompoundPredicate(type: .or, subpredicates: [predicate1, predicate2])
   predicateList.append(orCompoundPredicate)

   fetchRequest.predicate = NSCompoundPredicate(type: .and, subpredicates: predicateList)
   fetchRequest.fetchLimit = 1

1 Ответ

1 голос
/ 26 марта 2019

Возможно, у вас есть отношение «один к одному» от Quotes до Customers, если нет, установите его и назовите свойство customer

Затем используйте этот единственный предикат

let predicate = NSPredicate(format: "customer.name CONTAINS[c] %@ OR customer.email CONTAINS[c] %@", name, email)

Если вы хотите отфильтровать полную строку без учета регистра CONTAINS на самом деле неправильный оператор, лучше использовать LIKE

let predicate = NSPredicate(format: "customer.name LIKE[c] %@ OR customer.email LIKE[c] %@", name, email)

Примечание: Назовите сущности в единственном числе, семантическиваш метод вернет одну цитату , а не одну цитату

...