Привязать 5 лучших значений отношения основных данных ко многим с текстовыми полями - PullRequest
2 голосов
/ 14 июля 2010

Я делаю приложение, которое представляет счет мобильного телефона, используя Core Data. У меня есть три объекта: Bill, Line и Calls. Счета могут иметь много строк, а линии могут иметь много вызовов. Все это настроено на отношения. Прямо сейчас у меня есть табличное представление, которое отображает все счета. При двойном щелчке по счету на листе появляется всплывающее окно со списком всех строк в счете. Под всплывающим окном находится поле с множеством меток, отображающих различную информацию об этой строке. Ниже этой информации я хочу перечислить 5 лучших номеров, названных этой строкой в ​​этом месяце. Lines имеет отношение ко-многим с Calls, которое имеет два поля: число и минуты. У меня есть все вызовы для выбранной строки, загруженные в NSArrayController с дескриптором сортировки, который правильно упорядочивает значения. Как мне заполнить 5 меток верхними 5 значениями этого контроллера массива?

РЕДАКТИРОВАТЬ: Массив вызовов уже уникален, когда я собираю данные, я объединяю все отдельные вызовы в общее количество минут на номер для каждого месяца. Мне просто нужно отсортировать и отобразить первые 5 записей этого объединенного массива.

1 Ответ

1 голос
/ 14 июля 2010

Возможно, я ошибаюсь (и действительно надеюсь, что ошибаюсь), но похоже, что вам нужно использовать грубую силу на этом. Не существует операторов set / array , которые могут помочь, а также NSPredicate , похоже, не помогает.

Я думаю, что это на самом деле немного сложно, и, похоже, вам придется заняться кодированием. Руководство по программированию основных данных гласит:

Если вы выполняете выборку напрямую, вы обычно не следует добавлять Предикаты на основе Objective-C или сортировка дескрипторы запроса на выборку. Вместо этого вы должны применить их к результаты выборки. Если вы используете контроллер массива, вам может понадобиться подкласс NSArrayController, так что вы можете не передать дескрипторы сортировки в постоянный магазин и вместо этого сделать сортировка после того, как ваши данные были неправдоподобный.

Я думаю, что это применимо к вашему случаю, потому что важно учитывать, происходит ли сортировка или фильтрация сначала в запросе на выборку (когда предикат запроса на выборку и дескрипторы сортировки установлены). Это потому, что у вас будет соблазн использовать оператор набора / массива @distinctUnionOfObjects. Если список свернут до уникальной до сортировки, это не поможет. Если он применяется после сортировки, вы можете просто установить предел запроса на выборку равным 5, и вы получите свои результаты.

Учитывая документацию, я не знаю, как это будет работать. Кроме того, в этом случае может быть проще избежать NSArrayController для этой конкретной проблемы и просто использовать протокол NSTableViewDataSource, но это выходит за рамки этих вопросов и ответов.

Итак, вот один из способов сделать это:

  1. Создать предикат для фильтрации для отдельные позиции счета. *
  2. Создать дескриптор сортировки для сортировки позиции по номеру телефона (которые, надеюсь, в стандартизированный формат внутри, остальное неприятности ждут) через @ "call.number" в вашем случае.
  3. Создать запрос на выборку для строки объект сущности, с предикатом и сортировать дескрипторы и выполнять их **.

С этими отсортированными результатами было бы неплохо, если бы вы могли легко свернуть и «уникально» их, и снова у вас возникнет соблазн использовать @distinctUnionOfObjects. К сожалению, операторы set / array здесь не помогут (их нельзя использовать непосредственно в экземплярах NSArray / NSMutableArray или NSSet / NSMutableSet). Тогда это грубая сила.

Я бы создал массив topFive и перебрал бы результаты, добавив число в topFive, если его там еще нет, пока в topFive не будет 5 элементов или пока у меня не будет результатов.

Отображение его в вашем пользовательском интерфейсе (с использованием привязок или без него), как я уже сказал, выходит за рамки этих вопросов и ответов, поэтому я оставлю его там. Мне очень хотелось бы услышать, есть ли лучший способ сделать это - это определенно один из тех «похоже, что это должно быть легко, но это не» такие вещи. : -)

* Вы также можете использовать @unionOfObjects в вашем ключевом пути во время самой выборки, чтобы получить номера вызовов позиций выбранного счета, что, вероятно, будет более эффективным при выборке, но я устал от набрав, и вы получите идею. ; -)

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

...