Za moje życie nie mogę tego zmusić do działania.Jak skonstruować predykat dla zestawu NSFetchRequest setHavingPredicate :?
Załóżmy, że nasz obiekt jest obiektem zarządzanym z polem statusu i polem zamówienia.
W jaki sposób mogę uzyskać wszystkie zamówione towary posiadające więcej niż jedno zamówienie, które są takie same?
Proszę nie odpowiadać, żebym po prostu wykonał podzapytanie z @count w głównym predykacie, ponieważ znam to rozwiązanie, celem tego posta jest zrozumienie, jak używać predykatu mającego w danych podstawowych, co prawdopodobnie i tak będzie szybciej niż podzapytanie. (chyba że wyjaśnisz, dlaczego nie mogę użyć klauzuli mającej)
Poniższy kod zwróciłby tablicę słowników z liczbą zamówień na numer zamówienia. Chcę tylko dodać klauzulę mającą na celu ograniczenie mojej prośby, by zwracała tylko słowniki reprezentujące obiekty tych zamówień, których liczba jest większa niż 1.
Oto kod do tej pory i moje próby posiadania orzecznik:
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];
Czy kiedykolwiek uzyskać odpowiedź na ten temat? Znalazłem wiele niepotrzebnych odniesień do "setHavingPredicate", które nie wskazują, jaki musi być format tego predykatu. Nie ma przykładów pracy i nic, co próbowałem nie zadziałało ... –
@ ChristopherKing Nie, w zasadzie zrezygnowałem, nie ma ŻADNYCH informacji w sieci, a fora internetowe Apple nie są bardziej pomocne. Naprawdę wierzę, że nikt tego nie używa, ponieważ bardzo łatwo jest skonstruować tę samą funkcjonalność orzeczenia Posi, wykonując normalne pobieranie, a następnie przesuwając dane za pomocą filtru lub ręcznie za pomocą pętli. Chcemy wiedzieć, ponieważ zawsze jest "właściwa droga" do zrobienia czegoś, zwłaszcza jeśli jest to api. – thewormsterror