2012-03-21 12 views
5

Configuré el siguiente modelo en Core Data.SUBCAPA en NSPredicate y 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. 

Configuré el siguiente NSPredicate.

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

A través de este predicado que necesito para agarrar sólo los libros que no se han sincronizado y el de ellos órdenes relativas.

Este es el error que recibo.

Terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', razón: 'No se puede analizar la cadena de formato "isSync == 0 Y subconsulta (toBookOrders, $ x, $ x.toBook == AUTO)"

¿Alguna idea? Gracias de antemano.

Respuesta

24

Aquí está el quid de su problema:

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

Si divide eso en los dos subpredicates, como sugiere Scott, obtendrá:

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

El problema es que cada SUBQUERY no devuelve verdadero o falso, como debe ser un predicado. Devuelve una colección (una matriz) y una matriz no es lo mismo que verdadera o falsa. Por lo tanto, cuando crea el predicado, obtiene un error que indica que se trata de un formato no válido, porque lo que sigue al ANDno es un predicado. Es simplemente una expresión.

Usted es probablemente querer:

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

Esto le daría un predicado a encontrar todos los libros donde isSync es falso y al menos uno de los OrderBooks libro es que libro.

+0

Muchas gracias Dave. Buena explicación. ¿Podría alcanzar el mismo resultado también con CUALQUIER? Gracias. –

+2

@Flex_Addicted sí, podrías hacer '... AND ANY toBookOrders.toBook == SELF' –

+0

Te amo <3 ¡Muy útil de hecho! –

-2

independiente del isSync == 0 y SUBQUERY en distintos NSPredicate s, añadirlos a una NSArray a continuación, utilizar [NSCompoundPredicate andPredicateWithSubpredicates:array] para conseguir que se unieron en uno solo para pasar a su NSFetchSpecification.

+0

Gracias. El problema sigue ahí. Tal vez no sea posible usar * SELF * en las subconsultas. Gracias. –

+0

Así es como lo he usado: '[NSPredicate predicateWithFormat: @" SUBQUERY (childItems, $ child, $ child.columnName IN% @). @ Count! = 0 ", arrayOfThingsToMatchOn]'. El yo debería estar implícito, creo. –

+0

-1 Esto no es diferente de usar 'AND' en el formato de predicado. –

Cuestiones relacionadas