Per la vita di me non riesco a farlo funzionare.Come si costruisce il predicato per NSFetchRequest setHavingPredicate :?
Si supponga che la nostra entità sia un oggetto gestito con un campo di stato e un campo di ordine.
Come potrei fare per ottenere tutti orderedEntries che hanno più di un ordine che sono la stessa cosa?
Si prega di nessuna risposta mi dice di fare solo una sottoquery con @count nel predicato principale, poiché so di tale soluzione, il punto di questo post è capire come utilizzare il predicato avere nei dati di base, che sarebbe probabilmente sarà più veloce di una subquery comunque. (a meno che non spieghi perché non posso usare una clausola having)
Il seguente codice restituirebbe una matrice di dizionari con il numero di ordini per numero di ordine. Quello che voglio è poter aggiungere una clausola having per limitare la mia richiesta di restituire solo i dizionari che rappresentano oggetti di quegli ordini che hanno un conteggio maggiore di 1.
Ecco il codice fino ad ora ei miei tentativi di avere predicato:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"OrderedEntry"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setResultType:NSDictionaryResultType];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(status == %@)",[NSNumber numberWithInt:EntryStatusAlive]];
[fetchRequest setPredicate:predicate];
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"order"]; // Does not really matter
NSExpression *maxExpression = [NSExpression expressionForFunction: @"count:"
arguments: [NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName: @"orderCount"];
[expressionDescription setExpression: maxExpression];
[expressionDescription setExpressionResultType: NSInteger32AttributeType];
[fetchRequest setPropertiesToFetch: [NSArray arrayWithObjects:expressionDescription,@"order",nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:@"order",nil]];
//[fetchRequest setHavingPredicate:[NSPredicate predicateWithFormat:@"@count > 1"]];
//[fetchRequest setHavingPredicate:[NSComparisonPredicate predicateWithLeftExpression:maxExpression rightExpression:[NSExpression expressionForConstantValue:[NSNumber numberWithInteger:1]] modifier:NSDirectPredicateModifier type:NSGreaterThanPredicateOperatorType options:NSCaseInsensitivePredicateOption]];
NSError *error;
NSArray * array = [context executeFetchRequest:fetchRequest error:&error];
Avete mai ricevuto una risposta su questo? Ho trovato molti riferimenti inutili a "setHavingPredicate" che non forniscono alcuna indicazione su quale sia il formato di questo predicato. Nessun esempio funzionante, e niente di ciò che ho provato ha funzionato ... –
@ChristopherKing No, non ho affatto rinunciato, non ci sono informazioni sul web e i forum web di Apple non sono più utili. Credo davvero che nessuno lo usi, perché è molto semplice costruire la stessa funzionalità del predicato Avere semplicemente eseguendo un normale recupero e spostando poi i dati con un filtro o manualmente con un ciclo. Vogliamo sapere perché c'è sempre la "maniera giusta" di fare qualcosa, specialmente se viene fornita l'API. – thewormsterror