2009-10-27 9 views
5

ich den maximalen Wert eines Feldes in Kerndaten wollen, damit ich gesetzt haben folgende Anfrage auf:NSDictionaryResultType Ausdruck nicht berücksichtigt neu eingefügten Objekte

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

aber es scheint, dass es nicht berücksichtigt alle neuen Objekte, die zuvor in den Kontext eingefügt wurden. Soll es so funktionieren? Funktioniert es nur für Objekte im Geschäft?

Ich kann keinen Verweis auf es in der Dokumentation finden.

Danke,

Mike

Antwort

7

Ich habe eine Antwort von den Entwicklerforen Apple hatte und es wurde bestätigt, dass es nicht in ungesicherte Änderungen Rechnung trägt.

0

FYI, Sie können den gesamten Abschnitt NSExpression überspringen und gehen Sie einfach mit dem Fetch, dann verwenden Sie Auflistungsoperatoren für den maximalen Wert.

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

Während dies funktionieren würde, würde es sich darauf verlassen, jedes Objekt, das die Kriterien erfüllt, zuerst in den Speicher zu bringen. In meinem Fall wären das viel zu viele Objekte. Ich benötigte Core Data, um dies über eine aggregierte SQL-Anweisung für den Datenspeicher zu berechnen. –

+0

In diesem Fall können Sie einfach einen NSSortDescriptor und ein fetchLimit 1 verwenden, dann laden Sie nur das einzelne Objekt. – malhal

1

Dieses Verhalten ist dokumentiert (schlecht) in [NSFetchRequest setIncludePendingChanges:]. Ein Wert von YES wird mit NSDictionaryResultType nicht unterstützt. Dies bedeutet, dass Sie NSExpressionDescription für nicht gespeicherte Änderungen nicht verwenden können.

Verwandte Themen