2012-04-10 17 views
6

Come posso trovare tutte le categorie che hanno sottocategorie con più di 1 elementi? Sto usando il seguente codice, ma ottengo "chiavi multiple a molti non consentite qui".NSPredicate a molti rapporti

Devo utilizzare una SUBQUERY?

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

Help! :)

+0

Utilizzare più NSPredicates tramite NSCompoundPredicate. https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html –

+0

'items' probabilmente è un set, prova a usare' @ count' –

risposta

3

Nel tuo NSPredicate devi invece usare [email protected] >0.

Sorr, che funzionerebbe solo se categorie-sottocategorie fossero uno - a uno.

In realtà, cosa dovresti fare, è eliminare tutti i sottocategorie che non hanno elementi, penso.

Than tou dovrebbe solo controllare se ci sono sottocategorie e significherebbe che non sono vuote. [email protected] >0

+0

Grazie per il tuo aiuto.Ottenere 'NSInvalidArgumentException', motivo: 'Conteggio espressioni funzione non supportato: (subcategories.items)'. La categoria ha una relazione to-many con le sottocategorie e Sucategories su molte relazioni con gli elementi. – Nimrod7

2

È possibile utilizzare solo una relazione to-many in un back-end SQL. Questo lo farà, ma devi aggiungere il "back-link" in un set ordinato (per mantenere l'ordine se usi l'ordinamento - e l'unicità perché potresti avere più sottocategorie che tornano alla stessa categoria). Non ideale, ma non male, considerando i limiti.

// 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

Purtroppo, non credo che questo è possibile con il negozio SQL. Innanzitutto, vorrei sottolineare che non sono affatto vicino a un esperto di SQL e di solito cerco di progettare i miei archivi CoreData in modo che questi tipi di query non siano necessari. Tuttavia, la seguente SUBQUERY funziona con un archivio InMemory, quindi è una sottoquery in qualche modo correttamente formattata.

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

Tuttavia, tale predicato restituisce un errore quando si utilizza un archivio SQL. I documenti dicono che ci sono un buon numero di limitazioni quando si utilizzano i predicati con gli archivi SQL, quindi non sono né sorpreso né propenso a dedicare molto più tempo alla ricerca di questo.

Keypath contenente aggregato KVC dove non dovrebbe esserlo; fallito per gestire $ s.items. @ contano

+0

Sono appena riuscito a provare un approccio diverso. Questo lo fa per te? –

+0

sì, questo è quello che sto usando, ma stavo cercando di farlo attraverso subquery o @count (se c'è un modo) a livello di database. Non sono sicuro che l'iterazione sia il modo più efficiente. – Nimrod7

9

Sulla base della mia esperienza, è necessario modificare la stringa di formato predicato nella

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

da

@"ANY subcategories.items > 0" 

in

@"[email protected] > 0" 

Si noti che il tasto ANY keywo Devo andare anche tu, o dovrai interrogare la proprietà nel modo sbagliato.

+0

che solleva NSInvalidArgumentException, poiché le sottocategorie e gli articoli sono set. – Nimrod7

Problemi correlati