2009-10-27 13 views
5

Chcę maksymalną wartość pola w danych podstawowych więc utworzyły następujące żądanie:wyrażenie NSDictionaryResultType nie biorąc pod uwagę nowo wstawionych obiektów

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

Jednak wydaje się, że nie bierze pod uwagę żadnych nowych obiekty, które zostały wstawione do kontekstu przed ręką. Czy to ma działać? Czy działa tylko na obiektach w sklepie?

Nie mogę znaleźć żadnego odniesienia do niego w dokumentach.

Dzięki,

Mike

Odpowiedz

7

miałem odpowiedź od dewelopera forum Apple i potwierdzono, że nie bierze pod uwagę niezapisanych zmian.

0

FYI, możesz pominąć całą sekcję NSExpression i po prostu kontynuować pobieranie, a następnie użyć operatorów kolekcji dla maksymalnej wartości.

+2

Podczas gdy to by działało, polegałoby na tym, że najpierw wprowadzi do pamięci każdy obiekt spełniający kryteria. W moim przypadku byłoby to o wiele za dużo przedmiotów. Potrzebowałem Core Data do obliczenia tego poprzez zagregowaną instrukcję SQL przeciwko hurtowni danych. –

+0

W takim przypadku wystarczy użyć NSSortDescriptor i fetchLimit 1, a następnie załadować tylko do pojedynczego obiektu. – malhal

1

To zachowanie jest udokumentowane (słabo) w [NSFetchRequest setIncludePendingChanges:]. Wartość YES nie jest obsługiwana przez NSDictionaryResultType. Oznacza to, że nie można używać NSExpressionDescription na niezapisanych zmianach.

Powiązane problemy