2010-11-18 15 views
58

Ho due entità denominate "Category" e "Article" che hanno una relazione molti a molti. Voglio formare un predicato che cerca tutti gli articoli in cui category.name è uguale a qualche valore. Ho il seguente:Dati principali: NSPredicate per la relazione molti-a-molti. ("to-many key not allowed here")

NSEntityDescription *entityArticle = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:managedObjectContext]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; 
NSArray  *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"categories.name == [cd] %@", category.name]; 

[request setSortDescriptors:sortDescriptors]; 
[request setEntity:entityArticle]; 
[request setPredicate:predicate]; 

NSMutableArray *results = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy]; 

if ([results count] > 0) 
    NSLog(@"Results found."); 
else 
    NSLog(@"NO results found."); 

[request release]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

L'errore che ricevo è *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'

ci sono delle opzioni per recuperare i dati desiderati?

+0

una subquery può anche essere quello che ti serve. Vedere: http://stackoverflow.com/questions/11346546/core-data-unsupported-predicate-with-all-and-in – Collin

risposta

136

Si sta tentando di confrontare una raccolta (categories.name) con un valore scalare (category.name). È necessario utilizzare un comparatore di raccolta (CONTAINS) o utilizzare un modificatore di riferimento (ANY/ALL/SOME, ecc.).

Provare a utilizzare:

[NSPredicate predicateWithFormat:@"ANY categories.name =[cd] %@", category.name]; 

Oppure:

[NSPredicate predicateWithFormat:@"categories.name CONTAINS[cd] %@", category.name]; 
+0

Questo funziona per me, sia con che senza '[cd]'. Puoi approfondire la funzione di ciò? –

+15

@DuncanBabbage il '[cd]' significa eseguire una ricerca insensibile al maiuscolo/minuscolo (il 'c') e insensibile ai segni diacritici (' d'). –

+2

Non funziona se 'category' ha inverso la relazione' a one' con 'Articolo'. Qualche idea su come prevederlo? – iEngineer

Problemi correlati