Ho due modelli Reparto e Lavoratore. I dipartimenti devono avere molti rapporti (lavoratori) con i lavoratori. Il lavoratore ha il campo firstName. Come posso ottenere una lista dei lavoratori ordinata per firstName accedendo a departmet.workers? C'è un modo per aggiungere i descrittori di ordinamento nella relazione to-many?Ordinamento su molti rapporti Imposta nei dati di base
risposta
Le relazioni di molti in Core Data sono modellate come insiemi non ordinati. Tuttavia, è possibile creare una proprietà recuperata nell'entità Reparto che include un descrittore di ordinamento o è possibile ordinare il set in memoria all'interno dell'applicazione (NSArrayController
lo farà automaticamente impostando la proprietà sortDescriptors
).
Voterò per una proprietà recuperata poiché sembra il "modo più naturale" in Core Data. –
@BarryWark Sono d'accordo con Karsten, ma penso che sarebbe meglio includere alcuni dettagli su come creare il descrittore.Dopo un po 'di ricerca su google non ho ancora trovato come fare un descrittore "sort" in una proprietà recuperata, solo come abbinare le query tipo. – csga5000
Fornire l'esempio – MobileMon
È necessario definire il proprio metodo, ad esempio Lavoratori ordinati. Qualcosa di simile a questo:
- (NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
return [self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
codice snip di Hunter quasi funzionato per me, se non in quanto "lavoratori" è un NSSet, ho dovuto caricarlo in un NSMutableArray prima:
- (NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
NSMutableArray *sortThese = [NSMutableArray arrayWithCapacity:[self.workers count]];
for (id worker in self.workers) {
[sortThese addObject:worker];
}
return [sortThese sortedArrayUsingDescriptors:sortDescriptors];
}
miglioramento Minore su Adrian Hosey di codice:
Invece di iterare manualmente su tutti i lavoratori si può anche solo fare:
-(NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
return [self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
Probabilmente fa esattamente la stessa cosa della tua iterazione internamente, ma forse lo hanno reso più efficiente in qualche modo. È sicuramente meno digitante ...
Nota: quanto sopra funziona solo su iOS 4.0+ e OSX 10.6+. Nelle versioni più vecchie è necessario sostituire l'ultima riga con:
return [[self.workers allObjects] sortedArrayUsingDescriptors:sortDescriptors];
Uhm, l'ordinamento è O (n * log (n)), l'iterazione è O (n). Mentre questo è meno codice, è certamente più lento. –
Mentre vero, la differenza tra i frammenti di codice non è quella che itera e un tipo. Entrambi usano il metodo sort, è solo che Adrian sta usando il metodo [allObjects] per convertire in un array invece di crearne uno manualmente iterando sul set –
A partire da OS X 10.6 né l'iterazione manuale, né '[allObjects] 'sono necessari poiché NSSet stesso implementa' sortedArrayUsingDescriptors: ', risparmiando la creazione superflua di un NSArray temporaneo. – Regexident
mi accorgo che questo è abbastanza vecchio, ma la gente sarà ancora venire attraverso di esso (ho fatto) il post di
Adrian Schönig era buono. L'ho trovato utile per le basi, ma devi fare questo genere ogni volta che vuoi accedere al Set di lavoratori. Questo è molto inefficiente!
Invece è meglio fare il tipo ogni volta che si inserisce un nuovo oggetto e quindi lo si salva come Set in CoreData. Ciò significa che ogni volta che chiami CoreData verranno ordinati i lavoratori.
Ho fatto questo per il mio sistema utilizzando una categoria per NSManagedObject (Worker + Methods.h). Qui ho il metodo init per un nuovo lavoratore
// Worker+Methods.m
+(Worker *)newWorkerWithFirstname:(NSString *)firstName department:(Department *)department managedContext:(NSManagedObjectContext *)context {
Worker *w = [NSEntityDescription insertNewObjectForEntityForName:@"Worker" inManagedObjectContext:context];
w.firstName = firstName;
w.department = department;
[department orderWorkers];
return s;
}
//Department+Methods.m
-(void)orderServices {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
self.workers = [[NSSet alloc] initWithArray:[self.workers sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortNameDescriptor]]];
}
Ovviamente questo è inefficiente quando si aggiunge un sacco di lavoratori, ma si può solo spostare [Dipartimento orderWorkers]; succedere dopo che tutti gli operai sono stati aggiunti.
miglioramento Minore sopra soluzione di Adrian Schönig:
Ormai è necessario lanciare self.workers
a NSSet *
-(NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
return [(NSSet*)self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
- 1. molti a molti rapporti in JSON
- 2. NSPredicate a molti rapporti
- 3. Modulo di amministrazione di Django per rapporti molti a molti
- 4. Come memorizzare un'immagine nei dati di base
- 5. Dati principali, ordinamento di oggetti figlio uno-a-molti
- 6. Ember dati non consente voci duplicate nei rapporti hasMany
- 7. Come gestisci e utilizzi le relazioni di base dei dati "da molti a molti"?
- 8. come avere rapporti molti a molti in redis
- 9. Formato numerico decimale nei rapporti Birt
- 10. Uno-a molti rapporti in diagramma ER
- 11. Come contare uno a molti rapporti
- 12. Flask-SQLAlchemy filtro su molti a molti rapporti con il modello principale
- 13. Imposta relazione a relazione molti-a-molti
- 14. Impostazione di uno a molti rapporti con Fluent Nhibernate
- 15. SQL join sulla tabella di congiunzione con molti a molti rapporti
- 16. Come archiviare CGRect e altre cose nei dati di base
- 17. panda ordinamento dataframe sulla base di lista
- 18. SQL per una relazione molti a molti rapporti con interno si unisce
- 19. MySQL Unire sintassi per uno a molti rapporti
- 20. Come superare le carenze nei rapporti dal database EAV?
- 21. Ordinamento: Ordinamento array di base a più condizioni in Ruby
- 22. Analytics riceve eventi, ma non li registra nei rapporti
- 23. come memorizzare NSDictionary come proprietà trasformabili nei dati di base
- 24. Come formattare il codice nei rapporti di ricerca
- 25. CakePHP DeleteAll per molti a molti rapporti non rimuove unirsi record
- 26. Esporre endpoint riposante per un uno a molti rapporti
- 27. Liferay Servizio Builder 6.2: molti a uno rapporti
- 28. Dati principali: NSFetchRequest ordinamento per il conteggio della relazione a molti
- 29. primavera dati: rapporti tra 2 diverse fonti di dati
- 30. Dati principali: cosa dovrei usare come Descrittore di ordinamento con set ordinato (ios5) in una relazione molti-molti
Il suo vecchio filo .. Ma ha funzionato e mi ha aiutato alla grande! Libro-marcatura questa discussione Grazie a tutti .. !! – Shailesh