2009-10-27 12 views
5

Quiero que el valor máximo de un campo de datos básicos por lo que han establecido la petición siguiente:expresión NSDictionaryResultType no tener en cuenta los nuevos objetos insertados

// Create fetch 
NSFetchRequest *fetch = [[NSFetchRequest alloc] init]; 
[fetch setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:context]]; 
[fetch setResultType:NSDictionaryResultType]; 

// Expression for Max ID 
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"myNumbericID"]; 
NSExpression *minExpression = [NSExpression expressionForFunction:@"max:" arguments:[NSArray arrayWithObject:keyPathExpression]]; 
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
[expressionDescription setName:@"maxID"]; 
[expressionDescription setExpression:minExpression]; 
[expressionDescription setExpressionResultType:NSDoubleAttributeType]; 
[fetch setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]]; 

// Execute the fetch. 
double theID = 0; 
NSError *error; 
NSArray *objects = [context executeFetchRequest:fetch error:&error]; 
if (objects && [objects count] > 0) { 
    theID = [((NSNumber *)[[objects objectAtIndex:0] valueForKey:@"maxID"]) doubleValue]; 
} 

Sin embargo parece que no está tomando en cuenta cualquier nueva objetos que se han insertado en el contexto antes de la mano. ¿Es así como se supone que debe funcionar? ¿Funciona solo en objetos en la tienda?

No puedo encontrar ninguna referencia al respecto en los documentos.

Gracias,

Mike

Respuesta

7

he tenido una respuesta de los Foros de desarrolladores de Apple y se confirmó que no tiene en cuenta los cambios no guardados.

0

FYI, puede omitir toda la sección NSExpression y continuar con la búsqueda, luego utilizar los operadores de recopilación para el valor máximo.

theID = [objects valueForKeyPath:"@max.myNumbericID"]; 
+2

Si bien esto funcionaría, se basaría en traer todos los objetos que cumplan los criterios primero a la memoria. En mi caso, esto sería demasiados objetos. Necesitaba Core Data para calcular esto a través de una declaración de SQL agregado contra el almacén de datos. –

+0

En ese caso, puede usar un NSSortDescriptor y un fetchLimit 1, luego solo carga en el único objeto. – malhal

1

Este comportamiento se documenta (mal) en [setIncludePendingChanges NSFetchRequest:]. Un valor de SÍ no es compatible con NSDictionaryResultType. Esto significa que no puede usar NSExpressionDescription en cambios no guardados.

Cuestiones relacionadas