La expresión NSDictionaryResultType no tiene en cuenta los objetos recién insertados

StackOverflow https://stackoverflow.com/questions/1632029

  •  06-07-2019
  •  | 
  •  

Pregunta

Quiero el valor máximo de un campo en los datos principales, así que configuré la siguiente solicitud:

// 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 tiene en cuenta ningún objeto nuevo que se haya insertado en el contexto de antemano. ¿Es así como se supone que funciona? ¿Funciona solo en objetos de la tienda?

No puedo encontrar ninguna referencia en los documentos.

Gracias,

Mike

¿Fue útil?

Solución

Recibí una respuesta de los foros de desarrolladores de Apple y se confirmó que no tiene en cuenta los cambios no guardados.

Otros consejos

Este comportamiento está documentado (mal) en [NSFetchRequest setIncludePendingChanges:]. Un valor de YES no es compatible con NSDictionaryResultType. Esto significa que no puede usar NSExpressionDescription en cambios no guardados.

Para su información, puede omitir toda la sección NSExpression y continuar con la búsqueda, luego usar operadores de colección para el valor máximo.

theID = [objects valueForKeyPath:"@max.myNumbericID"];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top