5

Ho un oggetto chiamato Delivery con un gruppo di oggetti Customer associato. Ogni oggetto di consegna memorizza anche un mainCustomerId che è un NSNumber*. Ho un NSFetchedResultsController che viene utilizzato per gestire l'origine dati per un UITableView. Il problema è che voglio ordinare NSFetchedResultsController dal campo LastName del cliente (il cliente è di nuovo memorizzato in una relazione molti-a-molti chiamata customers sull'oggetto Delivery) dove uno dei clienti nel set ha un customerId uguale al Delivery's MainCustomerId.Ordina NSFetchedResultsController con oggetto in NSSet appartenente all'entità

The Delivery classe assomiglia a questo (solo le parti rilevanti)

@interface Delivery : NSManagedObject 
@property (nonatomic, retain) NSNumber * mainCustomerId; 
@property (nonatomic, retain) NSSet *customers; 
@end 

classe Customer assomiglia a questo

@interface Customer : NSManagedObject 
@property (nonatomic, retain) NSNumber * customerId; 
@property (nonatomic, retain) NSString * lastName; 
// And the inverse relationship to the deliveries 
@property (nonatomic, retain) NSSet *deliveries; 
@end 

ho bisogno di fare un NSSortDescriptor che fa qualcosa di simile (Nota, So che questo è il formato sbagliato e non funzionerà.Mi spero che comunichi l'idea)

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"customers.AnyobjectInSet.lastName WHERE AnyobjectInSet.customerId == masterCustomerId ascending:YES]; 

Ho provato diverse cose usando sottoquery e NSExpressions ma sono sempre venuto fuori corto dal momento che non posso usare alcuna funzionalità che usi Cocoa (come l'ordinamento con @selector) perché deve essere in grado di generare una vera query mysql senza elaborazione Cocoa di i dati. Ma sento che ci deve essere in qualche modo per farlo poiché sarebbe una query facile in mysql.

select * from Delivery JOIN Customer ON Customer.customerId=Delivery.mainCustomerId ORDER BY Customer.lastName; 

sto cercando di evitare di dover ordinare dopo i risultati vengono recuperate e memorizzare l'ordinamento torna sull'oggetto (che sarebbe stato facile, ma sento che è la soluzione sbagliata dal momento che sto selezionando i dati rilevanti Deve esserci un modo per ordinare da esso). Qualsiasi aiuto sarebbe molto apprezzato.

Grazie in anticipo.

+0

perché non fare uso di predicati e quindi applicare descrittore di sorta. – Leena

+0

Grazie Leena, non sono abbastanza sicuro di come utilizzerei un predicato per risolvere questo problema. Non sto filtrando i miei risultati con niente. Devo solo ordinarli per oggetto cliente con l'ID corrispondente. Hai un esempio di cosa intendi? – johnrechd

+0

Consultare questo documento: -http: //developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Predicates/predicates.html – Leena

risposta

2

Ok quindi forse mi manca qualcosa ma il suggerimento sul predicato ha perfettamente senso per me. Si prega di correggermi se sbaglio, ma (a patto di saper mainCustomerID):

NSNumber *mainCustomerID = ... 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"customerID == %@", mainCustomerID]; 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES]; 

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Customer"]; 
[request setPredicate:predicate]; 
[request setSortDescriptors:@[ sortDescriptor ]]; 

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request ... 

Quindi, fondamentalmente, se non è chiaro, questo sarà recuperare tutti i record di clienti in cui customerID è pari a mainCustomerID e poi ordinare i risultati in base alla lastName. Questo genererà internamente l'istruzione SQL per eseguire ciò per te.

Non è questo che stai cercando di fare?

Inoltre, se si desidera visualizzare il codice SQL che viene generato da CoreData in fase di esecuzione (utile strumento di debug), aprire il sistema e passare alla scheda 'Argomenti' e aggiungere quanto segue al 'Gli argomenti passati al lancio':

-com.apple.CoreData.SQLDebug 1 

felice Coding :)

+0

Grazie Shapps, non proprio quello che sto facendo però. Sto visualizzando oggetti Delivery nelle mie celle e voglio ordinare da un cliente in un NSSet che abbia lo stesso ID del cliente master referenziato. Dove la serie di clienti appartiene all'entità di consegna. Fondamentalmente, ho bisogno di ordinare su un particolare oggetto in un NSSet che appartiene all'entità recuperata. Buon codice anche a te. – johnrechd