2013-05-27 8 views
12

ho le seguenti due entità nel mio core Data Model:Core Data - il filtraggio di un rapporto a-molti con predicati

Manufacture {name, ...other attributes} 
Product {name, .... other attributes} 

Ho installato un uno a molti:

Manufacturer.manufactures <------>> Product.manufacturedBy 

I Sto cercando di costruire un predicato per restituire tutti i prodotti appartenenti ai produttori che corrispondono a una stringa di ricerca. Per esempio. se ci sono due produttori, "King Nut" e "Queen Nut", una ricerca su "Nut" dovrebbe restituire tutti i prodotti realizzati da King Nut e Queen Nut.

mio predicato funziona perfettamente quando il mio filtro è sull'entità del prodotto, tuttavia non riesco a ottenere qualsiasi predicato di lavorare durante il filtraggio sull'entità del produttore. Il set di risultati è vuoto.

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:[GBKDB context]]; 
searchValue = @"nut"; 
NSString *wildcardString = [NSString stringWithFormat:@"*%@*", searchValue]; 

Ho provato quanto segue:

predicate = [NSPredicate predicateWithFormat:@"manufacturedBy.name CONTAINS[cd] %@",searchValue]; 
    predicate = [NSPredicate predicateWithFormat:@"manufacturedBy.name like %@",wildcardString]; 
    predicate = [NSPredicate predicateWithFormat:@"manufacturedBy.name matches %@",wildcardString]; 
    predicate = [NSPredicate predicateWithFormat:@"ALL manufacturedBy.name like %@",wildcardString]; 
    predicate = [NSPredicate predicateWithFormat:@"ALL manufacturedBy.name like[cd] %@",@wildcardString]; 
+0

Che cosa si intende per ' "quando il filtraggio sull'entità del produttore"'? se provi a recuperare 'Product's, l'entità delle tue richieste deve essere' Product' –

+0

Sì. La mia richiesta di entità è per Prodotto: –

risposta

4

Date un'occhiata a this documento da parte di Apple. Fa un esempio facendo ciò che stai cercando di fare con il predicato "ANY".

+0

In quel documento, ci sono esempi: '" QUALSIASI impiegati.firstName come 'Matt *' "];' e '@" ANY employees.firstName come% @ ", wildcardedString];'. Nel primo esempio ci sono le virgolette singole, nella seconda non ci sono. Dovrei usare virgolette singole o no (wildcardString non contiene virgolette singole) –

+0

Sono esattamente la stessa cosa ... assumendo wildcardedString = @ "Matt *" – Rambatino

+1

documento è scaduto ora .. –

18

Per ottenere Product s prodotte da un produttore con nome contenente "dado", la richiesta dovrebbe essere simile:

NSString* searchVal = @"nut"; 
NSFetchRequest* r = [[NSFetchRequest alloc] initWithEntityName:@"Product"]; 
[r setPredicate:[NSPredicate predicateWithFormat:@"manufacturedBy.name CONTAINS[cd] %@",searchVal]]; 

Per ottenere Manufacturer s con i nomi di prodotti contenenti "dado" la richiesta dovrebbe essere simile:

NSString* searchVal = @"nut"; 
NSFetchRequest* r = [[NSFetchRequest alloc] initWithEntityName:@"Manufacture"]; 
[r setPredicate:[NSPredicate predicateWithFormat:@"ANY manufactures.name CONTAINS[cd] %@",searchVal]]; 

Se il set di risultati è vuoto, potrebbe essere dovuto al fatto che nessun oggetto rispondono il predicato (contenere il "dado" stringa).
Prova ad aggiungere alcune entità false con nomi noti e test.

Edit: Questo è il codice è possibile utilizzare per il test:

typedef void(^config_block_t)(id); 

- (void) synthesizeObjectsOfEntity:(NSString*)entity 
          context:(NSManagedObjectContext*)context 
          count:(NSUInteger)count 
         configBlock:(config_block_t)configBlock 
{ 
    for (;count;--count) { 
     NSManagedObject* object = [NSEntityDescription insertNewObjectForEntityForName:entity 
                   inManagedObjectContext:context]; 
     configBlock(object); 
    } 
} 

- (void) synthesizeProductsAndManufacturersInContext:(NSManagedObjectContext*)context 
{ 
    NSMutableArray* manufacturers = [NSMutableArray new]; 
    [self synthesizeObjectsOfEntity:@"Manufactur" 
          context:context 
           count:10 
         configBlock:^(Manufactur* m) { 
          m.name = [NSString stringWithFormat:@"m-%u%u%u",arc4random()%10,arc4random()%10,arc4random()%10]; 
          [manufacturers addObject:m]; 
         }]; 
    [self synthesizeObjectsOfEntity:@"Product" 
          context:context 
           count:100 
         configBlock:^(Product* p) { 
          p.name = [NSString stringWithFormat:@"p-%u%u%u",arc4random()%10,arc4random()%10,arc4random()%10]; 
          p.manufacturedBy = manufacturers[arc4random() % [manufacturers count]]; 
         }]; 
    [context save:NULL]; 
    [context reset]; 
    NSString* searchVal = @"3"; 
    NSFetchRequest* r = [[NSFetchRequest alloc] initWithEntityName:@"Product"]; 
    [r setPredicate:[NSPredicate predicateWithFormat:@"manufacturedBy.name CONTAINS[cd] %@",searchVal]]; 
    NSArray* match = [context executeFetchRequest:r error:NULL]; 
    NSLog(@"matched: %u",[match count]); 
} 
+0

Sto cercando di utilizzare il tuo primo esempio per restituire i prodotti ... non funziona ancora! Il mio database non è vuoto, ho DBVisualizer dove posso visualizzare i dati. –

+0

Sei sicuro di aver impostato correttamente la proprietà 'name' di' Manufactur' (è trasformabile, l'hai sovrascritto)? –

+0

Nota: non è possibile utilizzare l'operatore contiene (ad esempio, QUALSIASI dipendenti.firstName contiene "Matteo") poiché l'operatore contiene non funziona con l'operatore ANY. – jose920405