2009-10-27 7 views
5

voglio il massimo valore di un campo nei dati di base così ho predisposto la seguente richiesta:NSDictionaryResultType espressione non tenendo conto di nuovi oggetti inseriti

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

Tuttavia sembrerebbe che non sta prendendo in considerazione qualsiasi nuovo oggetti che sono stati inseriti nel contesto prima della mano. È così che dovrebbe funzionare? Funziona solo sugli oggetti nel negozio?

Non riesco a trovare alcun riferimento ad esso nei documenti.

Grazie,

Mike

risposta

7

Ho avuto una risposta da parte di Apple Developer Forum ed è stato confermato che non tiene conto delle modifiche non salvate.

0

FYI, è possibile saltare l'intera sezione NSExpression e andare avanti con il recupero, quindi utilizzare gli operatori di raccolta per il valore massimo.

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

Mentre ciò funzionerebbe, farebbe affidamento sul portare prima in memoria tutti gli oggetti che soddisfano i criteri. Nel mio caso questo sarebbe di gran lunga troppi oggetti. Avevo bisogno di Core Data per calcolare questo tramite un'istruzione SQL aggregata contro l'archivio dati. –

+0

In tal caso, è sufficiente utilizzare un NSSortDescriptor e un fetchLimit 1, quindi caricare solo il singolo oggetto. – malhal

1

Questo comportamento è documentato (male) in [setIncludePendingChanges NSFetchRequest:]. Un valore di YES non è supportato con NSDictionaryResultType. Ciò significa che non è possibile utilizzare NSExpressionDescription sulle modifiche non salvate.

Problemi correlati