2009-10-27 5 views
5

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

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

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

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

Спасибо,

Майк

ответ

7

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

0

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

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

В то время как это сработает, оно будет полагаться на то, чтобы каждый объект, отвечающий критериям, был первым. В моем случае это было бы слишком много объектов. Мне нужны Core Data, чтобы вычислить это с помощью агрегированного оператора SQL в хранилище данных. –

+0

В этом случае вы можете просто использовать NSSortDescriptor и fetchLimit 1, а затем загружать только один объект. – malhal

1

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

Смежные вопросы