2012-01-30 9 views
7

A. b e B. a sono inverse di molte relazioni. Perché questo predicato per A lavoro:Perché "NOT IN" non funziona in questo NSPredicate?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT SELF IN %@", bObject.a]; 

mentre questo non lo fa:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT %@ IN b", bObject]; 

Penso che entrambe le predicati dovrebbero dare lo stesso risultato - la raccolta di A s che non hanno alcuna relazione con bObject via a<-->b. Ma in effetti, il primo dà la raccolta corretta mentre il secondo no.

Aggiornamento:


Ecco un sample project cui A. b è incorporato da Account. filtered_clients e B. a è incorporato da Client. filtered_by.

Attivare il commento della riga 143 e della linea 144 in MasterViewController.m per vedere la differenza.

Si prega di aiutarmi a trovare il bug nel mio codice, o confermare è un bug Core Data in modo da poter segnalare ad Apple. Grazie mille.

+0

Il tuo secondo predicato sembra testare se b non è in b - è questo che intendevi? –

+0

Come ha fatto notare Nick: puoi dare un po 'più di codice. Qual è la variabile 'b'? Come stanno generando la richiesta di recupero? –

+0

Per essere più chiaro, ho cambiato il nome della variabile in "bObject" che è un'istanza di B. – an0

risposta

0

Dalla documentazione:

Importante è necessario definire molti-a-molti in entrambe le direzioni , cioè, è necessario specificare due relazioni, ciascuno dei quali è la inversa dell'altra. Non è possibile definire una relazione to-many in in una direzione e provare a utilizzarla come molti a molti. Se lo fai, ti sarà finire con problemi di integrità referenziale.

Quindi controllare questo:

  1. A ha una relazione a molti a B.
  2. B ha un rapporto a molti ad A.
  3. L'un rapporto è l'inverso del rapporto B .
  4. La relazione B è l'inverso della relazione A.
+0

Si prega di leggere la domanda e i commenti sottostanti. È, naturalmente, una relazione da molti a due. – an0

+0

Confido che tu abbia ricontrollato ... – Mundi

+0

Sì, ho ricontrollato. – an0

3

Ecco un'altra idea: forse sta cercando di "negare" la bObject con l'NOT. Quindi, prova:

@"NOT (%@ IN b)" 
+1

Uguale a @ "NOT% @ IN b". – an0

0

Penso di aver trovato la risposta per le persone che si imbattono in questa domanda. A quanto pare è necessario usare SELF perché funzioni, almeno nel mio caso con due to-many. Questo funziona per me:

NOT (SELF IN %@) 
Problemi correlati