Für das Leben von mir kann ich nicht scheinen, dass dies funktioniert.Wie konstruieren Sie das Prädikat für NSFetchRequest setHavingPredicate :?
Angenommen, unsere Entität ist ein verwaltetes Objekt mit einem Statusfeld und einem Auftragsfeld.
Wie würde ich alle geordertenEinträge mit mehr als einer Bestellung, die die gleichen sind, gehen?
Bitte keine Antworten sie zu sagen, eine Unterabfrage mit @count im Haupt Prädikat nur zu tun, da ich von dieser Lösung weiß, ist der Punkt, von diesem Post zu verstehen, wie das mit Prädikat in Kerndaten verwenden, was würde wahrscheinlich sowieso schneller als eine Unterabfrage. (Wenn Sie nicht erklären, warum ich keine Klausel haveing verwenden kann)
Der folgende Code würde ein Array von Wörterbüchern mit der Anzahl der Bestellungen pro Bestellnummer zurückgeben. Was ich will, ist in der Lage sein, eine having -Klausel hinzufügen, um meine Anfrage zu beschränken nur die Wörterbücher für Objekte dieser Aufträge, die eine Zahl größer als 1 haben.
Hier ist der Code so weit und meine Versuche zu haben Prädikat:
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];
Haben Sie jemals eine Antwort auf diese interessiert jemand losgeht? Ich habe viele nutzlose Verweise auf "setHavingPredicate" gefunden, die keinen Hinweis darauf geben, wie das Format dieses Prädikats aussehen muss. Keine Arbeitsbeispiele, und nichts, was ich versucht habe, hat funktioniert ... –
@ChristopherKing Nein, überhaupt nicht, ich habe im Grunde aufgegeben, es gibt keine Informationen im Web und die Apple Web Foren sind nicht hilfreicher. Ich glaube wirklich, dass niemand dies verwendet, da es sehr einfach ist, die gleiche Funktionalität des Having-Prädikats zu konstruieren, indem einfach ein normaler Abruf durchgeführt wird und dann mit einem Filter oder manuell mit einer Schleife durch die Daten verschoben wird. Wir wollen es wissen, denn es gibt immer den "richtigen Weg", etwas zu tun, besonders wenn die API zur Verfügung gestellt wird. – thewormsterror