Nпредикат для получения всех родителей с конкретными детьми ? (IOS)

#iphone #xcode #core-data #nspredicate

#iPhone #xcode #основные данные #nspredicate

Вопрос:

Допустим, у меня есть следующая базовая структура данных в IOS:

 Parent1
    Child1.1: Text='A', Number=1
    Child1.2: Text='B', Number=1
Parent2
    Child2.1: Text='B', Number=1
    Child2.2: Text='A', Number=2
Parent3
    Child3.1: Text='B', Number=2
    Child3.2: Text='A', Number=1
 

Я хочу повторно просмотреть всех родителей, у которых есть дочерний элемент с Text=’A’ и Number=1 (Parent1 и Parent3 в приведенном выше примере).

По сути, то, что мне нужно, — это предикат для родительской сущности, который выглядит следующим образом:

 ANY (child.Text = 'A' AND child.Number = 1)
 

Но это не работает — кажется, у меня не может быть круглых скобок после ключевого слова ANY.

Следующее тоже не очень хорошо (даже если оно действительно).:

 ANY child.Text = 'A' AND ANY child.Number = 1
 

потому что он также возвращает Parent2 .

Есть ли способ сделать это в предикате, или я должен сделать это программно (например, извлекать только дочерние элементы без использования ключевого слова ANY и создавать массив родителей из обратных отношений)?

Ответ №1:

В предикате вы должны использовать == для равенства — работает ли это тогда?

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

 
NSMutableArray* predicatesToCombine = [[NSMutableArray alloc]init];

[predicatesToCombine addObject:@"child.Text == 'A'"];
[predicatesToCombine addObject:@"child.Number == 1"];

NSPredicate* predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicatesToCombine];

...

[predicatesToCombine release];

 

Комментарии:

1. NSPredicate преобразует = в ==, оба они одинаковы. Кроме того, я уже использую NSCompoundPredicate (приведенный мной пример был упрощен), и это не имеет ничего общего с проблемой — он объединяет только простые предикаты с И или ИЛИ или предшествует простому предикату с NOT . Моя проблема заключается в ключевом слове ANY, за которым следуют круглые скобки, а не в том, что находится внутри круглых скобок.

2. @AmiramStark, вы получите лучшие ответы, показав свой реальный код, а не «упрощенные примеры», иначе люди будут тратить время, советуя вам попробовать то, что вы, возможно, уже пробовали.

3. jrturon, я не вижу смысла показывать десятки строк сложного кода, когда нет никакой разницы между реальным кодом и упрощенным. Двойные знаки равенства не имеют значения в соответствии с официальным синтаксисом строки формата NSPredicate, а составные предикаты ничего не делают в отношении ключевого слова ANY. Упрощенный код помогает сосредоточиться на реальной проблеме, и я считаю, что это гораздо лучший способ.