2010-03-26 15 views
10

Quindi, diciamo che ho un magazzino di genitori figli e che il genitore ha una relazione uno a molti con i figli (genitore.children) e hanno tutti nomi di battesimo. Ora, durante il recupero iniziale per i genitori, posso specificare un descrittore di ordinamento per riaverli in ordine di nome, ma come posso ordinare i bambini in ordine? Se faccio un [parent.children allObjects] li restituisce semplicemente in un guazzabuglio e dovrei ordinare dopo il fatto, ogni volta.Dati principali, ordinamento di oggetti figlio uno-a-molti

Grazie, Sam

risposta

11

Sam,

Se ho letto la tua domanda correttamente, si desidera impostare un recupero che restituisce un elenco ordinato dei figli di un genitore specifica. Per fare questo, vorrei impostare un fetch per entità "bambini" e quindi utilizzare un predicato per limitare i risultati:

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:@"children" inManagedObjectContext:moc]]; 
[request setSortDescriptors:[NSArray initWithObject:[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"(parent == %@)", parent]]; 

Ovviamente, il vostro soggetto e nomi degli attributi possono essere diverse. Nell'ultima riga, la variabile padre dovrebbe essere un riferimento all'istanza NSManagedObject del genitore di cui si desidera figli.

+0

vedo, stai suggerendo eseguendo un'operazione di recupero invece di utilizzare il guasto CoreData? È meno performante? vale a dire l'impostazione di un recupero con il predicato e la sua esecuzione più costosa del semplice fare [genitore.children allOggetti] e lasciare che objectObject riempia l'errore? – Shizam

+0

Penso che tu abbia ragione nel dire che eseguire una richiesta di recupero completamente nuova sarà più lenta che riempire il difetto con [genitore.children allOggetti] e poi ordinare l'NSArray che ottieni. Nella mia mente, il vantaggio di una nuova richiesta di recupero è che è possibile utilizzare un NSFetchedResultsController per mantenere aggiornato e ordinato il set di risultati (cioè se si crea un nuovo figlio del genitore, lo inserirà automaticamente nell'elenco dei risultati) . Se pensate di mantenere l'elenco dei bambini in giro per un certo periodo di tempo e l'elenco potrebbe cambiare (ad esempio, state visualizzando un elenco modificabile), utilizzerei questa strategia. –

16

Se si desidera utilizzare un NSArray, e non un NSFetchedResultsController, c'è un altro modo:

NSSortDescriptor *alphaSort = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]; 
NSArray *children = [[parent.children allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:alphaSort]]; 
+0

Shosti: la chiamata 'allObjects' sulla relazione to-many assicura che tutti gli oggetti in quella relazione siano in errore e ora in memoria se non in precedenza? A volte l'entità genitore viene recuperata senza le relazioni di recupero ansiose, e successivamente, desideriamo che tutti i bambini (oggetti correlati a-may) siano presenti. Mi chiedo se questo è garantito per inciampare sempre tutti i difetti in quella particolare relazione. – idStar

Problemi correlati