#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. Упрощенный код помогает сосредоточиться на реальной проблеме, и я считаю, что это гораздо лучший способ.