Выражение NSDictionaryResultType, не учитывающее вновь вставленные объекты
-
06-07-2019 - |
Вопрос
Мне нужно максимальное значение поля в основных данных, поэтому я настроил следующий запрос:
// 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];
}
Однако, похоже, он не принимает во внимание какие-либо новые объекты, которые были вставлены в контекст заранее.Вот как это должно работать?Это работает только на предметах в магазине?
Я не могу найти никаких упоминаний об этом в документах.
Спасибо,
Майк
Решение
Я получил ответ на форумах разработчиков Apple, и было подтверждено, что он не учитывает несохраненные изменения.
Другие советы
Это поведение описано (плохо) в [NSFetchRequest setIncludePendingChanges:].Значение YES не поддерживается с помощью NSDictionaryResultType.Это означает, что вы не можете использовать NSExpressionDescription для несохраненных изменений.
К вашему сведению, вы можете пропустить весь раздел NSExpression и просто продолжить выборку, а затем использовать операторы сбора для получения максимального значения.
theID = [objects valueForKeyPath:"@max.myNumbericID"];