Questa domanda è nel contesto di Core Data, ma se non sbaglio, si applica ugualmente bene a un caso SQL più generale.Come mantenere una tabella ordinata con Core Data (o SQL) con inserimenti/cancellazioni?
voglio mantenere una tabella ordinata con Core Data, con la possibilità per l'utente di:
- filari di riordino
- inserimento di nuove linee ovunque
- cancellare qualsiasi linea esistente
Qual è il miglior modello di dati per farlo? Vedo due modi:
1) Modello come un array: aggiungo una proprietà int position
alla mia entità
2) Modello come una lista collegata: aggiungo due relazioni one-to-one, next
e previous
dal mio ente a sé
1) lo rende facile da ordinare, ma dolorosa per inserire o eliminare, come allora dovete aggiornare il position
di tutti gli oggetti che vengono dopo
2) rende facile inserire o eliminare, ma molto difficile da ordinare. In effetti, non penso di sapere come esprimere un Sort Descriptor (clausola SQL ORDER BY
) per quel caso.
Ora posso immaginare una variante 1):
3) aggiungere un int ordering
struttura al soggetto, ma invece di averlo contare uno per uno, ce l'ha contano 100 per 100 (per esempio). Quindi l'inserimento è semplice come trovare qualsiasi numero tra l'ordine degli oggetti esistenti precedenti e successivi. Il rinegoziamento costoso deve avvenire solo quando i 100 fori sono stati riempiti. Rendere questa proprietà un float piuttosto che un int lo rende ancora migliore: è quasi sempre possibile trovare un nuovo float a metà strada tra due float.
Sono sulla buona strada con la soluzione 3) o c'è qualcosa di più intelligente?
Sì. Hai scavato una vecchia domanda, e hai ragione :-). Nonostante alcuni problemi con NSOrderedSet (che ha un'API che è meno completa di NSArray per esempio) e le relazioni ordinate (che credo non siano completamente supportate dai controller di risultato recuperati). –
Sì, ho provato a far funzionare NSFetchedResultsController con una relazione ordinata. Per la maggior parte con successo, ma non è riuscito ad aggiornare in modo intelligente la vista tabella, cioè l'animazione di inserimento o rimozione, invece di fare semplicemente '[tableView reloadData]' ... Quindi alla fine ho rinunciato ai controller dei risultati recuperati e ho appena pre-scaricato l'intero elenco :-/ –