NSDictionaryResultType expression ne prenant pas en compte les objets récemment insérés

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

  •  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

Était-ce utile?

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"];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top