¿Cómo construyes el pnetworkingicado para NSFetchRequest setHavingPnetworkingicate :?

Por mi vida, no puedo hacer que esto funcione.

Suponga que nuestra entidad es un object gestionado con un campo de estado y un campo de pedido.

¿Cómo haría para conseguir que todas las Entidades orderadas tengan más de un pedido que sean iguales?

Por favor, no hay respuestas que me pidan que haga una subconsulta con @count en el pnetworkingicado principal, ya que conozco esa solución, el objective de esta publicación es comprender cómo usar el pnetworkingicado en datos centrales, lo que probablemente sea más rápido que un subconsulta de todos modos. (a less que expliques por qué no puedo usar una cláusula que tiene)

El siguiente código devolvería una matriz de dictionarys con el número de pedidos por número de pedido. Lo que quiero es poder agregar una cláusula que contenga para restringir mi request de devolver solo los dictionarys que representan los objects de esos pedidos que tienen un recuento mayor que 1.

Aquí está el código hasta ahora y mis bashs de tener un pnetworkingicado:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"OrdenetworkingEntry" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; [fetchRequest setResultType:NSDictionaryResultType]; NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat: @"(status == %@)",[NSNumber numberWithInt:EntryStatusAlive]]; [fetchRequest setPnetworkingicate:pnetworkingicate]; NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"order"]; // Does not really matter NSExpression *maxExpression = [NSExpression expressionForFunction: @"count:" arguments: [NSArray arrayWithObject:keyPathExpression]]; NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; [expressionDescription setName: @"orderCount"]; [expressionDescription setExpression: maxExpression]; [expressionDescription setExpressionResultType: NSInteger32AttributeType]; [fetchRequest setPropertiesToFetch: [NSArray arrayWithObjects:expressionDescription,@"order",nil]]; [fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:@"order",nil]]; //[fetchRequest setHavingPnetworkingicate:[NSPnetworkingicate pnetworkingicateWithFormat:@"@count > 1"]]; //[fetchRequest setHavingPnetworkingicate:[NSComparisonPnetworkingicate pnetworkingicateWithLeftExpression:maxExpression rightExpression:[NSExpression expressionForConstantValue:[NSNumber numberWithInteger:1]] modifier:NSDirectPnetworkingicateModifier type:NSGreaterThanPnetworkingicateOperatorType options:NSCaseInsensitivePnetworkingicateOption]]; NSError *error; NSArray * array = [context executeFetchRequest:fetchRequest error:&error]; 

Terminé con esto para cualquier persona interesada

 -(BOOL)ordersAreSaneOnDay:(NSNumber*)dayNumber forUser:(User*)user inContext:(NSManagedObjectContext*)context { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"BasicEntry" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; [fetchRequest setResultType:NSDictionaryResultType]; NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat: @"(status == %@) && ((type != %@) && (type != %@) && (dayNumber == %@)) && ((user == NIL) || (user == %@))",[NSNumber numberWithInt:EntryStatusAlive],[NSNumber numberWithInt:EntryTypeTask],[NSNumber numberWithInt:EntryTypeCompletedTask],dayNumber,user]; [fetchRequest setPnetworkingicate:pnetworkingicate]; NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"order"]; // Does not really matter NSExpression *maxExpression = [NSExpression expressionForFunction: @"count:" arguments: [NSArray arrayWithObject:keyPathExpression]]; NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; [expressionDescription setName: @"orderCount"]; [expressionDescription setExpression: maxExpression]; [expressionDescription setExpressionResultType: NSInteger32AttributeType]; [fetchRequest setPropertiesToFetch: [NSArray arrayWithObjects:expressionDescription,@"order",nil]]; [expressionDescription release]; [fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:@"order",nil]]; //[fetchRequest setHavingPnetworkingicate:[NSPnetworkingicate pnetworkingicateWithFormat:@"self.order.@count > 1"]]; //[fetchRequest setHavingPnetworkingicate:[NSComparisonPnetworkingicate pnetworkingicateWithLeftExpression:maxExpression rightExpression:[NSExpression expressionForConstantValue:[NSNumber numberWithInteger:1]] modifier:NSDirectPnetworkingicateModifier type:NSGreaterThanPnetworkingicateOperatorType options:NSCaseInsensitivePnetworkingicateOption]]; NSError *error; NSArray * array = [context executeFetchRequest:fetchRequest error:&error]; array = [array filtenetworkingArrayUsingPnetworkingicate:[NSPnetworkingicate pnetworkingicateWithFormat:@"orderCount > 1"]]; //NSLog(@"it worked %@",array); [fetchRequest release]; if ([array count]) return FALSE; return TRUE; 

}

En primer lugar, cada vez que bash algo análogo a lo que estás haciendo, obtengo un error que no puede pasar una relación de muchos a setPropertiesToFetch: La documentation de NSFetchRequest respalda esto: "Las descripciones de properties pueden representar attributes, relaciones o expresiones " . Así que ese es el problema # 1.

El problema n. ° 2 es que parece que no puede agruparse por una relación de muchos a otros (esto no queda claro en la documentation, pero tiene el mismo error y también tiene sentido).

Eliminar "order" de las properties para search. Agrupar por un atributo. Modifique su pnetworkingicado principal para que solo incluya aquellos attributes que agrupe (o simplemente elimine). Especifique "order" en su pnetworkingicado.

 [fetchRequest setPropertiesToGroupBy: @[ @"???" ]]; [fetchRequest setHavingPnetworkingicate: [NSPnetworkingicate pnetworkingicateWithFormat: @"self.order.@count > 1"]]; 

Ahora verá que la request funcionará, pero los resultados probablemente no fueron lo que esperaba:

  - NSArray - NSDictionary { status = @"alive", orderCount = "4" } - NSDictionary { status = @"alive", orderCount = "9" } - NSDictionary { status = @"alive", orderCount = "2" } - etc... 

NSDictionaryResultType realidad no te da nada para identificar esos objects, solo te da los valores.

Entonces, su siguiente paso es get ID para esos objects OrdenetworkingEntry . El truco consiste en include una expresión que le devuelva el NSManagedObjectID como key en cada dictionary.

No sé si esto realmente te dará un performance mejorado en absoluto (solo con AND-ing en el pnetworkingicado principal). En mi experiencia, una de las mejores cosas que puede hacer para mejorar el performance de extracción es crear singleton NSPnetworkingicates y usar variables de sustitución para configurar cada extracción. El análisis de pnetworkingicciones puede ser costoso.

Los types de resultados del dictionary pueden ser un dolor. Por lo general, solo build un buen pnetworkingicado es mejor. Tiendo solo a usarlos para expresiones (es decir, realizar cálculos de tipo estadístico en el gráfico que devuelven un valor). Si observa todas las restricciones sobre las properties para search y agrupar por y las restricciones de pnetworkingicado, esto parece ser para lo que Apple lo desea. Ni siquiera estoy seguro de que sea posible hacer lo que quieres hacer agrupando y usando un pnetworkingicado que tenga, por ejemplo, ¿qué vas a agrupar? Si por el estado (que debe agrupar por para include en su pnetworkingicado), ¿no queuepsará todas las OrderEntries y no obtendrá los ID de object y los importes de pedido por separado? Lo mejor es atenerse al pnetworkingicado principal para esto, no agrupar y tener pnetworkingicados.