2012-03-21 18 views
5

Ho impostato il seguente modello in Dati principali.SUBQUERY in NSPredicate e NSInvalidArgumentException

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

Ho impostato il seguente NSPredicate.

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

Attraverso questo predicato, ho bisogno di prendere solo i libri che non sono stati sincronizzati ei loro ordini relativi.

Questo è l'errore che ricevo.

terminazione app a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione: 'Impossibile analizzare la stringa di formato "isSync == 0 E sottoquery (toBookOrders, $ x, $ x.toBook == AUTO)"

Qualche idea? Grazie in anticipo.

risposta

24

Ecco il punto cruciale del problema:

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

Se si divide che fino nelle due subpredicates, come suggerisce Scott, si otterrà:

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

Il problema è che ogni SUBQUERY non restituisce vero o falso, come deve fare un predicato. Restituisce una collezione (una matrice) e una matrice non è la stessa cosa di vero o falso. Pertanto, quando si crea il predicato, si riceve un errore indicando che si tratta di un formato non valido, perché il materiale dopo lo ANDnon è un predicato. È semplicemente un'espressione.

Sei probabilmente volendo:

@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)[email protected] > 0" 

Questo darebbe un predicato di trovare tutti i libri in cui isSync è falso e almeno uno del Libro OrderBooks è quel Libro.

+0

Grazie mille Dave. Bella spiegazione Posso raggiungere lo stesso risultato anche con ANY? Grazie. –

+2

@Flex_Addicted sì, si potrebbe fare '... AND ANY toBookOrders.toBook == SELF' –

+0

Ti amo <3 Molto utile davvero! –

-2

Separare la isSync == 0 e SUBQUERY in separati NSPredicate s, aggiungerli a un NSArray quindi utilizzare [NSCompoundPredicate andPredicateWithSubpredicates:array] per farli uniti in uno solo di passare al vostro NSFetchSpecification.

+0

Grazie. Il problema è ancora lì. Forse non è possibile usare * SELF * nelle sottoquery. Grazie. –

+0

Ecco come l'ho usato: '[NSPredicate predicateWithFormat: @" SUBQUERY (childItems, $ child, $ child.columnName IN% @). @ Count! = 0 ", arrayOfThingsToMatchOn]'. Il sé dovrebbe essere implicito, penso. –

+0

-1 Questo non è diverso dall'uso di 'AND' nel formato del predicato. –