Выражение NSDictionaryResultType, не учитывающее вновь вставленные объекты - PullRequest
5 голосов
/ 27 октября 2009

Мне нужно максимальное значение поля в основных данных, поэтому я настроил следующий запрос:

// 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];
}

Однако может показаться, что в нем не учитываются какие-либо новые объекты, которые были вставлены в контекст до этого. Это как это должно работать? Это работает только на объекты в магазине?

Я не могу найти ссылку на это в документации.

Спасибо

Mike

Ответы [ 3 ]

7 голосов
/ 28 октября 2009

Я получил ответ от форумов разработчиков Apple, и было подтверждено, что он не учитывает несохраненные изменения.

1 голос
/ 24 февраля 2011

Это поведение задокументировано (плохо) в [NSFetchRequest setIncludePendingChanges:]. Значение YES не поддерживается с NSDictionaryResultType. Это означает, что вы не можете использовать NSExpressionDescription для несохраненных изменений.

0 голосов
/ 11 января 2011

К вашему сведению, вы можете пропустить весь раздел NSExpression и просто продолжить выборку, а затем использовать операторы сбора для максимального значения.

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