2012-01-30 25 views
7

A. b y B. a son relaciones inversas a-muchas. ¿Por qué este predicado para A trabajo:¿Por qué "NOT IN" no funciona en este NSPredicate?

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

mientras éste no lo hace:

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

Creo que ambos predicados deben dar el mismo resultado - la colección de A s que no tienen relación con bObject a través a<-->b. Pero, de hecho, el primero da la colección correcta mientras que el segundo no.

Actualización:


Aquí está una sample project que A. b está incorporado por Account. filtered_clients y B. a está incorporado por Client. filtered_by.

Alternar los comentarios de la línea 143 y la línea 144 en MasterViewController.m para ver la diferencia.

Ayúdeme a encontrar el error en mi código, o confirme que es un error Core Data para poder informarlo a Apple. Muchas gracias.

+0

Su segundo predicado parece estar probando si b no está en b - ¿es eso lo que usted quiso decir? –

+0

Como Nick señaló: ¿Puedes dar un poco más de código? ¿Cuál es la variable 'b'? ¿Cómo están generando la solicitud de búsqueda? –

+0

Para ser más claro, he cambiado el nombre de la variable a "bObject" que es una instancia de B. – an0

Respuesta

0

De la documentación:

importante que debe definir muchos-a-muchos relaciones en ambas direcciones , es decir, debe especificar dos relaciones, cada uno siendo el inversa de la otra. No se puede simplemente definir una relación de muchos en en una dirección y tratar de usarla como muchos a muchos. Si lo hace, obtendrá problemas de integridad referencial.

así que mira esto:

  1. A tiene una relación de muchos a B.
  2. B tiene una relación de muchos a A.
  3. El Una relación es la inversa de la relación B .
  4. La relación B es la inversa de la relación A.
+0

Lea la pregunta y los comentarios debajo. Es, por supuesto, una relación de muchos a la manty. – an0

+0

Confío en que haya verificado dos veces ... – Mundi

+0

Sí, lo he verificado dos veces. – an0

3

Aquí hay otra idea: tal vez está tratando de "negar" el bObject con el NOT. Por lo tanto, intente:

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

Lo mismo que @ "NOT% @ IN b". – an0

0

Creo que encontré la respuesta para las personas que hacen esta pregunta. Aparentemente necesitas usar SELF para que funcione, al menos en mi caso con dos a muchas relaciones. Esto funciona para mí:

NOT (SELF IN %@) 
Cuestiones relacionadas