Основные данные с отношением ко многим - Создание NSP-предиката с ALL в SUBQUERY - PullRequest
0 голосов
/ 23 июля 2011

Мой граф объектов выглядит следующим образом

SnapShot - >> Pane -> ManagedImage

Я пытаюсь найти SnapShot, который содержит точные ManagedImages, содержащиеся в наборе.

Код, который я получил, теперь возвращает массив моментальных снимков, которые имеют один или несколько ManagedImages, которые находятся в наборе.Затем я выполняю поиск в массиве, чтобы найти правильный снимок SnapShot, но полагаю, что фильтрация в подзапросе будет намного быстрее

. С помощью NSP предиката я могу получить уникальный снимок SnapShot, содержащий ВСЕ из ManagedImages, которыев наборе?

Вот мой код

mySet = ... // A unique set of (usually 3) managedImages that I'm trying to find a snapShot for

NSFetchRequest *request = ...
request.entity = [NSEntityDescription entityForName:@"SnapShot" inManagedObjectContext:[self managedObjectContext]];

// Want this to work but sends an exception
//request.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(self.panes, $pane, ALL $pane.managedImage IN %@).@count != 0", mySet];

// Using this
request.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(self.panes, $pane, $pane.managedImage IN %@).@count != 0", mySet];

1 Ответ

0 голосов
/ 23 июля 2011

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

Итак, ваш график отношений, вероятно, на самом деле выглядит так:

SnapShot <-->> Pane <--> ManagedImage

или, может быть:

SnapShot <<-->> Pane <<--> ManagedImage

Поскольку у вас есть набор ManagedImage объектов, все, что вам нужно сделать, - это пройти по траектории pane.snapShot или panes.snapShots, чтобы найти SnapShot объекты, связанные с каждым ManagedImage объектом. Затем вы просто извлекаете уникальные SnapShot объекты.

В первом случае дело тривиально из-за отношения один-к-одному

ManagedImage-->Pane-->SnapShot

Во втором случае вам необходимо сначала получить все уникальные объекты SnapShot:

NSSet *shots=[aMangedImageObj valueForKeyPath:@"distinctUnionOfSets.panes.snapShots"];

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

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

...