0

У меня есть структура базовой модели данных вроде следующий:NSPredicate и основные данные: извлекать объекты между отношениями

Product <-->> OrderProduct where the relationship (from Product to OrderProduct) is called productOrders while the inverse is called product 

Order <-->> OrderProduct where the relationship is called orderProducts while the inverse is called order 

Client <-->> Order where the relationship is called orders while the inverse is called client 

В течение UIViewController я использую NSFetchRequest, связанный со следующим предикатом:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(ANY productOrders.order.client.code == %@)", clientCode]; 

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

Теперь я должен добавить еще один шаг. Найдите последний заказ (заказ по дате) для конкретного клиента. Я пробовал следующий предикат, но он не работает:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(ANY productOrders.order.client.code == %@ AND [email protected])", clientCode]; 

где orderDate имеет тип NSDate.

Должен ли я использовать SUBQUERY? Как я могу это достичь? Заранее спасибо.

ответ

1

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

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"ANY productOrders.order.client.code == %@ AND productOrders.order.orderDate == %@", clientCode, lastDate]; 

Я не знаю, было ли это правильно, но это работает.

Надеюсь, это поможет.

+0

Если вам нужна только одна запись, вы действительно можете использовать предикат. – ggfela

2

Вы можете использовать sortDescriptor в своем fetchrequest (fetchrequest принимает массив sortdescriptors).

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"productOrders.order.orderDate" ascending:NO]; 

[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

редактировать: см NeverBe комментарий

+0

Я не уверен, что это может быть решением, так как я создал запрос от объекта Product. –

+0

Когда вы используете CoreData на основе SQLite, вы можете напрямую обращаться к базе данных. Сортировка в коде будет медленной, так как вам потребуется много вызовов CoreData. – ggfela

+3

Это было решение. Вы должны установить правильный ключ для сортировки дескриптора (productOrders.order.orderDate) и установить ограничение на выборку для 1 для запроса выборки. также сортировка должна быть desc – NeverBe