NSDictionaryResultType expression ne prenant pas en compte les objets récemment insérés
-
06-07-2019 - |
Question
Je veux la valeur maximale d'un champ dans les données de base, j'ai donc configuré la requête suivante:
// 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];
}
Cependant, il semblerait que cela ne tienne pas compte des nouveaux objets déjà insérés dans le contexte. Est-ce ainsi que cela est supposé fonctionner? Cela fonctionne-t-il uniquement sur les objets du magasin?
Je ne trouve aucune référence à cela dans la documentation.
Merci,
Mike
La solution
J'ai reçu une réponse des forums de développeurs Apple et il a été confirmé qu'elle ne tenait pas compte des modifications non enregistrées.
Autres conseils
Ce comportement est documenté (mal) dans [NSFetchRequest setIncludePendingChanges:]. La valeur YES n'est pas prise en charge avec NSDictionaryResultType. Cela signifie que vous ne pouvez pas utiliser NSExpressionDescription sur des modifications non enregistrées.
Pour votre information, vous pouvez ignorer toute la section NSExpression et continuer l’extraction, puis utiliser des opérateurs de collecte pour la valeur maximale.
theID = [objects valueForKeyPath:"@max.myNumbericID"];