SUBQUERY в NSPredicate и NSInvalidArgumentException - PullRequest
5 голосов
/ 21 марта 2012

Я настроил следующую модель в Core Data.

Book has a to-many relationship, called toBookOrders, with OrderBook entity. The inverse is called toBook.
Book has a BOOL value property called isSync.

Я настроил следующее NSPredicate.

NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:moc];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)"];

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

Это ошибка, которую я получаю.

Завершение приложения из-за необработанного исключения NSInvalidArgumentException, причина: «Невозможно разобрать формат строка "isSync == 0 AND SUBQUERY (toBookOrders, $ x, $ x.toBook == SELF)"

Есть идеи? Заранее спасибо.

Ответы [ 2 ]

24 голосов
/ 22 марта 2012

Вот суть вашей проблемы:

@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)"

Если вы разделите это на два подпредиката, как предполагает Скотт, вы получите:

  • isSync == 0
  • SUBQUERY(toBookOrders, $x, $x.toBook == SELF)

Проблема в том, что каждый SUBQUERY не возвращает true или false, как предикат должен. Он возвращает коллекцию (массив), и массив не то же самое, что истина или ложь. Таким образом, когда вы создаете предикат, вы получаете ошибку, что это неверный формат, потому что материал после AND не является предикатом . Это просто выражение.

Вы вероятно хотите:

@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF).@count > 0"

Это даст вам предикат для поиска всех книг, где isSync ложно, и по крайней мере одна из OrderBooks Книги - это та Книга.

0 голосов
/ 21 марта 2012

Разделите isSync == 0 и SUBQUERY на отдельные NSPredicate с, добавьте их к NSArray, затем используйте [NSCompoundPredicate andPredicateWithSubpredicates:array], чтобы объединить их в один и передать на NSFetchSpecification.

...