2012-11-02 13 views
8

Ho trovato una soluzione a questo utilizzando la sottoquery, ma non capisco perché quello che stavo cercando di fare prima non ha funzionato.Dati principali, NSPredicate, ANY key.path == nil

Ecco il mio modello di dati. Sto andando a dare consigli.

enter image description here

posso fare quanto segue come un predicato:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject]; 

che funziona bene, e restituisce qualsiasi pezzo di consulenza in cui almeno una delle sue condizioni ha quel tipo di terreno.

Tuttavia, quando provo a fare questo, non riesce:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"]; 

Quello che voglio fare è restituire qualsiasi pezzo di consulenza in cui almeno una delle sue condizioni non hai impostato tipo di terreno.

Tuttavia, il seguente funziona:

[NSPredicate predicateWithFormat:@"SUBQUERY(conditions, $x, $x.terrain == nil)[email protected] > 0"]; 

qualcuno può spiegare il motivo per cui, durante la ricerca di zero, non posso utilizzare la sintassi ANY?

+0

Buon punto qui. + 1 –

risposta

24

Qualcuno può spiegare perché, durante la ricerca di nil, non è possibile utilizzare la sintassi ANY?

Sì! Ecco cosa sta succedendo.

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"]; 

In primo luogo, rompiamo questo fino alle espressioni destra e sinistra appropriate:

conditions.terrain 

Questa sarà valutata prendendo l'oggetto SELF (un Advice esempio) e richiedendo l'valueForKeyPath:@"conditions.terrain". Il risultato di questo keypath sarà una raccolta. Stai facendo essenzialmente:

Advice *a = ...; 
NSSet *conditions = [a conditions]; 
NSSet *terrains = [conditions valueForKey:@"terrain"]; 

Quindi, avete una collezione di (potenziali) Terrain istanze. Ora, cosa sappiamo delle collezioni in Objective-C? Bene per una cosa, non possono contenere nil. Possono contenere solo oggetti.Ciò significa che quando esegue la parte ANY del predicato, itererà attraverso gli elementi nell'array e vedrà che nessuno di essi è nil.

Pertanto, il tuo predicato non funziona. Ho provato a giocare con alcune altre varianti (usando [NSNull null] invece di nil, ecc.), Ma nessuna sembrava funzionare.

Sembra quindi che l'uso di un SUBQUERY per risolvere questo è quanto di meglio si possa ottenere. Consiglio vivamente lo filing a bug dettagliando le vostre aspettative ed esprimendo il motivo per cui pensate che questo dovrebbe funzionare.

+1

+1 per la spiegazione profonda. –

+0

Ottima risposta. Grazie per essere accurato e preciso. –

0

Credo che non sia possibile utilizzare nil nella query. Dovresti forse usare NULL o il costrutto della stringa di formato come "ANY conditions.terrain == %@", nil.

Che enigmi me è che il vostro sottoquery funziona ...

È possibile che questo non è corretto, come NULL e NIL possono essere usati in modo intercambiabile.

Invece, lo NSExpression Class Reference fornisce esattamente il modello (con @count) come esempio preferito.

Hai verificato che la relazione del terreno sia facoltativa?

+0

Sì, è opzionale. –

Problemi correlati