tutorial query existing example espaƱol data iphone core-data nspredicate

iphone - query - swift 4 core data relationships



Core Data, NSPredicate y to-many key (4)

Entonces, para probar una relación no vacía, esto realmente funciona:

[NSPredicate predicateWithFormat:@"relationship.@count != 0"]

La solución dada por Ashley Clark falla para mí dando "muchas claves no permitidas aquí"

Tengo un modelo de datos básicos en el que una entidad de tarea incluye una relación opcional a muchos excluidasOcurrencias. Una de las propiedades de excluidOccurrences es start, que es un objeto NSDate. La entidad ExcludedOccurrence tiene una relación inversa obligatoria one-to con la entidad Task.

Para buscar tareas para un día específico, necesito asegurarme de que el día especificado no aparezca como la propiedad de inicio de ninguna entidad ExcludedOccurrence. Uno de los sub-predicados que estoy tratando de usar es por lo tanto

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(ALL excludedOccurrences.start != %@))", today];

donde hoy es un objeto de NSDate para hoy, incluidos solo los componentes de día, mes y año. Todas las propiedades de inicio de ocurrencias excluidas también incluyen solo los componentes de día, mes y año.

Si bien esto debería estar bien, al menos leyendo la documentación para Core Data y NSPredicate, aparece el siguiente mensaje de error:

Aplicación de finalización debido a una excepción no detectada ''NSInvalidArgumentException'', razón: ''predicado no soportado

Si uso el predicado equivalente

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"!(ANY excludedOccurrences.start == %@))", today];

no se lanza ninguna excepción, sin embargo, el código no funciona como se esperaba: la ocurrencia de hoy, que no se debe excluir, se excluye.

Tampoco estoy seguro de cómo probar el caso excluidoOcurrencias == nil: el siguiente predicado

NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"];

causas en tiempo de ejecución la excepción

muchas teclas no permitidas aquí

Sin embargo, dado que la relación excludecurrencias es opcional, también necesito probar si es nula.

¿Cómo trato con esto? Gracias de antemano.


Para probar una relación vacía, debe comparar el recuento de la clave to-many con cero.

[NSPredicate predicateWithFormat:@"excludedOccurrences.@count == 0"];

En cuanto a sus subpredicados, tenga en cuenta que solo puede tener uno de los modificadores ALL o ANY en su predicado final, aunque puede usar ese modificador varias veces a lo largo del predicado.

No está bien : ANY foo.bar = 1 AND ALL foo.baz = 2
OK: ANY foo.bar = 1 AND !(ANY foo.baz != 2)


Y en swift 2, algo así como:

request.predicate = NSPredicate(format: " relationship.@count != 0")


con la ayuda de todos ustedes, finalmente logré determinar el predicado correcto para mi escenario. Parece que un objeto NSDate se maneja como un doble, sin embargo, el doble nunca es algo así como 3.7, siempre es como 3.0. Por lo tanto, el siguiente predicado funciona correctamente en mis pruebas:

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences.@count == 0 || (excludedOccurrences.@count > 0 && NONE excludedOccurrences.start == %@))",thisDate];

donde thisDate es un objeto NSDate que contiene solo los componentes de día, mes y año (como en el caso de la propiedad de inicio de la entidad ExcludedOccurrence).

La prueba de una relación vacía se realiza básicamente utilizando el operador @count aggregate, como lo sugirieron algunas personas en Apple.

Una vez más, muchas gracias por su ayuda. Todavía observo que la documentación está defectuosa en varias partes (especialmente cuando dice que TODO funciona bien mientras que, en cambio, no funciona en absoluto).