usar tutorial objective español datos data cuando iphone core-data

iphone - objective - tutorial core data español



¿Cómo configurar correctamente una NSPredicate para una relación de muchos al usar Core Data? (2)

Tengo un modelo de datos básicos en el que una entidad de tarea incluye una relación de muchos días excluidos de la opción a la entidad ExcludedDay. Una de las propiedades de ExcludedDay es day, que es un objeto NSDate. La entidad ExcludedDay tiene una relación inversa obligatoria one-to con la entidad Task.

Para obtener las tareas para un día específico, necesito asegurarme de que el día especificado no aparezca como la propiedad del día de ninguna entidad ExludedDay.

Empecé a intentar

NSPredicate *dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"ALL excludedDays.day != %@", today];

Sin embargo, a pesar de lo que dice la documentación, ALL no funciona y la aplicación arroja una excepción: aplicación de terminación debido a la excepción no detectada ''NSInvalidArgumentException'', razón: ''predicado no soportado.

Después de publicar la misma pregunta en este foro, pude idear el siguiente predicado con la ayuda de varias personas:

NSPredicate * dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"excludedDays.@count == 0 || (excludedDays.@count > 0 && NONE excludedDays.day == %@))", today];

Si bien esto funcionó al principio, acabo de descubrir que esto solo funciona cuando la entidad ExcludedDay contiene SOLAMENTE un día. Tan pronto como la entidad ExcludedDay contiene más de un día para la misma tarea, este predicado deja de funcionar. Como resultado, se selecciona una tarea para un día, aunque el día aparezca como un día en la entidad ExcludedDay, lo cual es, por supuesto, incorrecto. El problema no está relacionado con el día de la propiedad como un objeto NSDate: al reemplazar el día con el NSString correspondiente o de forma equivalente con un entero, todavía tengo el mismo problema y un comportamiento incorrecto.

¿Cuál es la forma correcta de implementar el predicado en este caso? ¿Puede tratarse de un error relacionado con el operador agregado ANY cuando se usan datos centrales? Gracias de antemano, esto ahora me está volviendo loco.


Muy curioso sobre cómo resolver esto, configuré un pequeño proyecto y creé el contexto que estás usando.

NSDate *today = [NSDate date]; NSMutableArray *objects = [NSMutableArray array]; { NSArray *day = [NSArray arrayWithObjects:today, [today dateByAddingTimeInterval:20.0f], nil]; NSDictionary *excludedDay = [NSDictionary dictionaryWithObject:day forKey:@"day"]; NSDictionary *object = [NSDictionary dictionaryWithObject:excludedDay forKey:@"excludedDay"]; [objects addObject:object]; } { NSArray *day = [NSArray arrayWithObjects:[today dateByAddingTimeInterval:20.0f], nil]; NSDictionary *excludedDay = [NSDictionary dictionaryWithObject:day forKey:@"day"]; NSDictionary *object = [NSDictionary dictionaryWithObject:excludedDay forKey:@"excludedDay"]; [objects addObject:object]; } NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE excludedDay.day == %@", today]; NSArray *filtered = [objects filteredArrayUsingPredicate:predicate]; NSLog(@"%@", filtered);

Esto le da al objeto cuando:

  1. La matriz de días está vacía
  2. La matriz de día no contiene la fecha ''hoy''

Esto no le da al objeto cuando:

  1. La matriz de día contiene el "hoy"
    • No importa cuántos objetos de la matriz diurna estén

Resulta que este es otro problema con la documentación faltante y / o inconsistente.

El predicado correcto en este caso es el siguiente:

[NSPredicate predicateWithFormat:@"(excludedOccurrences.@count == 0) OR (0 == SUBQUERY(excludedOccurrences, $sub, $sub.day == %@).@count)", today]

En el predicado, se usa una subconsulta para comprobar si el número de vulnerabilidades excluidas relacionadas con una fecha que coincida con la fecha de su prueba es igual a cero. Sin embargo, la documentación es engañosa. Esto es lo que dice la Guía de programación de predicados con respecto al uso de predicados en conjunto con muchas relaciones.

Uso de predicados con relaciones

Si usa una relación de muchos, la construcción de un predicado es ligeramente diferente. Si quiere buscar Departamentos en los que al menos uno de los empleados tiene el primer nombre "Matthew", por ejemplo, utiliza un operador ANY como se muestra en el siguiente ejemplo:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"ANY employees.firstName like ''Matthew''"];

Si desea encontrar Departamentos en los que a todos los empleados se les paga más de una cierta cantidad, utiliza un operador ALL como se muestra en el siguiente ejemplo:

float salary = ... ; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"ALL employees.salary > %f", salary];