Iphone NSP предсказать, как сделать INNER JOIN? - PullRequest
4 голосов
/ 30 ноября 2009

Я просматривал документацию и некоторые другие посты на этом сайте, но я просто не могу понять, как это решить, что на самом деле очень просто в SQL.

В основном у меня есть 2 сущности Инструменты и предложения А «Сделки» используют «Инструмент» для выполнения желаемой операции. Теперь я хочу перечислить атрибуты Deals и Instrument, которые использовались для этой сделки. Так что в SQL я бы сделал:

ВЫБРАТЬ * ИЗ инструментов INNER JOIN предложения ON Instruments.ID = Deals.InstrumentID

Как бы мне этого добиться с помощью NSPredicate? Любая помощь будет высоко оценена. Спасибо.

-Oscar

1 Ответ

12 голосов
/ 30 ноября 2009

Во-первых, вы должны сделать все возможное, чтобы избавиться от мышления SQL. Базовые данные не являются ORM. Это инфраструктура управления объектными графами, в которой просто использует SQLite в качестве одного из возможных постоянных бэкэндов. Хотя вы можете просмотреть SQL, который он использует, через переменные среды (для отладки), SQL является частной реализацией. Базовые данные могли быть реализованы вообще без SQL.

Итак, постарайтесь не думать в терминах таблиц БД. У вас есть коллекция Deal isntances. Вы хотите их свойства? Используйте Кодировка значения ключа , чтобы получить свойства этих экземпляров и связанных экземпляров Instrument. Предполагая, что у вас есть NSSet экземпляр Deals, который называется deals:

[deals valueForKey:@"dealProperty"];

даст вам NSSet значений dealProperty от каждого Deal экземпляра. Если вы хотите получить несколько свойств одновременно, вы можете использовать -[NSObject(NSKeyValueCoding) dictionaryWithValuesForKeys:]. С помощью этого метода вы можете получить ключи только на один уровень, например, только 'dealProperty1', 'dealProperty2', но не 'dealRelation.relationProperty' или 'dealRelation. @ count'.

Чтобы получить «вложенные» свойства, просто используйте ключевой путь:

[deals valueForKeyPath:@"instrument.instrumentProperty"];

даст вам набор значений instrumentProperty экземпляра Instrument, связанного с каждым экземпляром Deal, при условии, что instrument является отношением один к одному от Deal до Instrument , Если отношение «один ко многим», вы получите набор значений instrumentProperty.

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

for(Deal *deal in deals) {
  //use attribute access to get properties of deal and associated instrument
  deal.dealProperty
  deal.instrument.instrumentProperty //for one-to-one

  for(Instrument *instrument in deal.instruments) { //for one-to-many instruments
    instrument.instrumentProperty;
  }
}

с использованием перечисления соответствующих коллекций.

...