2012-04-10 6 views
6

Wie kann ich alle Kategorien finden, die Unterkategorien mit mehr als 1 Elementen haben? Ich benutze den folgenden Code, aber ich bekomme "mehrere zu viele Schlüssel hier nicht erlaubt".NSPredate to-many Beziehungen

Muss ich eine SUBQUERY verwenden?

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Categories"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"]; 
[request setPredicate:predicate]; 

Hilfe! :)

+0

Verwenden Sie mehrere NSPredicates über NSCompoundPredicate. https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html –

+0

'Artikel' ist wahrscheinlich ein Satz, versuchen Sie' @ count' –

Antwort

3

In Ihrem NSPredicate sollten Sie stattdessen [email protected] >0 verwenden.

Sorr, das würde nur funktionieren, wenn Kategorien-Unterkategorien eins zu eins wären.

Wirklich, was Sie tun sollten, ist löschen Sie alle Unterkategorien, die keine Elemente haben, denke ich.

Als tou sollte nur überprüfen, ob es Unterkategorien gibt und es würde bedeuten, dass sie nicht leer sind. [email protected] >0

+0

Danke für Ihre Hilfe.Abrufen von 'NSInvalidArgumentException', Grund: 'Anzahl der nicht unterstützten Funktionsausdrücke: (Unterkategorien.Artikel)'. Die Kategorie hat eine Zu-Viele-Beziehung zu Unterkategorien und eine Zu-Viele-Beziehung zu Elementen. – Nimrod7

2

Sie können in einem SQL-Backend nur eine einzige Beziehung verwenden. Dies wird es tun, aber Sie müssen den "Back-Link" in eine geordnete Menge hinzufügen (um die Reihenfolge zu erhalten, wenn Sie Sortierung verwenden - und Eindeutigkeit, weil Sie mehrere Unterkategorien erhalten können, die auf die gleiche Kategorie zurückführen). Nicht ideal, aber nicht schlecht, wenn man die Einschränkungen berücksichtigt.

// Search for all subcategories with item count > 0 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Subcategory"]; 
request.predicate = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
NSError *error = nil; 
// They should have an inverse relationship to their category... 
// We have to iterate and insert them in to a set, but there is no additional 
// disk access. 
NSMutableOrderedSet *results = [NSMutableOrderedSet orderedSet]; 
[[self.projectDatabase.managedObjectContext executeFetchRequest:request error:&error] enumerateObjectsUsingBlock:^(Subcategory *obj, NSUInteger idx, BOOL *stop) { 
    [results addObject:obj.category]; 
}]; 

EDIT

Leider habe ich glaube nicht, das mit dem SQL-Speicher möglich ist. Zunächst möchte ich betonen, dass ich nirgendwo in der Nähe eines SQL-Experten bin, und ich versuche normalerweise, meine CoreData-Speicher so zu gestalten, dass diese Art von Abfragen nicht notwendig sind. Die folgende SUBQUERY funktioniert jedoch mit einem InMemory-Speicher, also handelt es sich um eine etwas korrekt formatierte Unterabfrage.

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(subcategories, $s, [email protected] > 0)[email protected] > 0"]; 

Dieses Prädikat gibt jedoch einen Fehler bei der Verwendung eines SQL-Speichers. Die Dokumente geben an, dass es bei der Verwendung von Prädikaten mit SQL-Speichern eine Reihe von Einschränkungen gibt. Daher bin ich weder überrascht noch geneigt, zu viel Zeit damit zu verbringen, dies zu erforschen.

Keypath mit KVC-Aggregat, wo es keines geben sollte; fehlgeschlagen $ s.items zu handhaben. @

+0

Bin einfach dazu gekommen, einen anderen Ansatz auszuprobieren. Macht es das für dich? –

+0

yep, das ist was ich benutze, aber ich wollte es durch Unterabfrage oder @count (wenn es einen Weg gibt) auf Datenbankebene tun. Ich bin mir nicht sicher, ob Iteration der effizienteste Weg ist. – Nimrod7

9

Aufgrund meiner Erfahrung zählen, sollten Sie das Prädikat Format-String in

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];  

von

@"ANY subcategories.items > 0" 

in

@"[email protected] > 0" 
ändern

Beachten Sie, dass der Schlüssel ANY rd muss auch gehen, oder Sie werden die Eigenschaft in die falsche Richtung fragen.

+0

, die NSInvalidArgumentException auslöst, da Unterkategorien und Elemente Sets sind. – Nimrod7