Базовые данные @sum и @count для 3 взаимосвязей таблиц (один ко многим)

У меня такая схема:

  • Столик Заказчик: Name
  • Порядок таблиц: OrderDate, Amount
  • Таблица OrderDetails: ItemName, Amount

Отношение «один ко многим» выглядит как Customer --> Orders --> OrderDetails
Мне нужно получить запрос @sum и @count для таблиц Orders и OrderDetails соответственно.

Я пробовал valueForKeyPath, но он работает только с таблицей заказов и не может попасть в таблицу OrderDetails:

[Customer valueForKeyPath:@"[email protected]"]

что я ищу, чтобы получить счетчик Orderdetails, или получить счет, используя вложенный предикат (производительность является проблемой), например:

[Customer valueForKeyPath: @"[email protected]]

person melgamal    schedule 31.05.2013    source источник


Ответы (1)


Ваш второй неверен, поскольку вы смешиваете атрибуты и имена классов и пропускаете шаг. Если вы хотите подсчитать детали заказа для всех заказов клиента, вам нужно проделать немного больше работы. Сначала давайте посмотрим на это, не сводя все в один вызов, чтобы упростить выполнение:

NSSet *orders = [customer valueForKey:@"orders"];
NSSet *details = [orders valueForKey:@"orderDetails"];
NSInteger count = [details count];

Так что с этим все работает. Но вы хотите, чтобы это было одной строкой. Для этого нам нужно объединить все детали заказа из нескольких заказов, прежде чем мы попытаемся произвести подсчет. Приведенный выше код делает это как побочный эффект вызова -valueForKey: для NSSet. Однако мы можем сделать это намеренно с помощью KVC:

NSSet *details = [customer valueForKeyPath:@"[email protected]"];
NSInteger count = [details count];

@distinctUnionOfSets сообщает KVC о вызове -valueForKey: результатов от orders и о том, что он должен ожидать возврата одного или нескольких экземпляров NSSet, объединения содержимого этих экземпляров в один NSSet и его возврата. Осталось только поставить счет на конец:

NSInteger count = [customer valueForKeyPath:@"[email protected].@count"];

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

Более подробную информацию о KVC можно найти на странице разработчика Apple. Веб-сайт.

person Marcus S. Zarra    schedule 31.05.2013
comment
работает, но последний комбинированный valueForKeyPath @ orders. @ independentUnionOfSets.orderDetails. @ count] - person melgamal; 01.06.2013
comment
работает, но последний комбинированный valueForKeyPath @ orders. @ independentUnionOfSets.orderDetails. @ count] ошибки: - [NSMutableSet unionSet:]: set аргумент не является NSSet ', если я разделю указанный выше путь ключа на детали NSSet, а затем счетчик NSinteger, он работает , - person melgamal; 01.06.2013
comment
Если это сработает, вы должны принять ответ. Кроме того, если последний из них не работает для вас, рекомендуется выяснить, почему, чтобы вы могли изучить KVC. - person Marcus S. Zarra; 01.06.2013
comment
Спасибо за решение, оно очень поучительно. Я тоже заставил его работать, за исключением той же ошибки, что и @ user1194556. Я подумал о вашем решении и не уверен, что понимаю почему, и хотел бы. Наконец: можно ли использовать это в NSSortDescriptor? (Я думаю, что, возможно, нет, поскольку нет метода для создания NSSortDescriptor с ключом path). - person Tim Arnold; 19.12.2013
comment
Поскольку @count не работает (скорее всего, потому, что он пытается применить счет первым, а не последним), я сомневаюсь, что вы добьетесь успеха с дескриптором сортировки. Но попробовать стоит, кто знает, может, вас это удивит :) - person Marcus S. Zarra; 19.12.2013