2010-09-05 15 views
7

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?

risposta

0

Da iOS 5 è possibile (e dovrebbe) utilizzare NSOrderedSet e la sottoclasse mutabile. → Core Data Release Notes for OS X v10.7 and iOS 5.0

Vedere la risposta accettata allo How can I preserve an ordered list in Core Data.

+1

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). –

+0

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 :-/ –

4

Se l'ordine è arbitrario, ovvero non è inerente ai dati da modellare, non è possibile aggiungere un attributo o una relazione per mantenere l'ordine.

Vorrei consigliare l'elenco collegato dal momento che è più semplice da mantenere. Non sono sicuro di cosa intendi per una lista collegata che è difficile da ordinare, dal momento che non è molto probabile che non si procederà a un ordinamento arbitrario. Invece, recupererai la maggior parte delle istanze e camminerai verso il basso.

L'ordine di un attributo float divisibile è una buona idea. È possibile creare un numero quasi infinito di indici intermedi semplicemente sottraendo l'indice esistente inferiore da un indice esistente più alto, dividendo il risultato per due e quindi aggiungendo quel risultato all'indice inferiore.

È anche possibile combinare un indice divisibile con un elenco collegato se è necessario un ordinamento per tabelle o simili. L'elenco collegato renderebbe facile trovare gli indici esistenti e l'indice divisibile renderebbe facile ordinare se necessario.

I dati principali resistono a questo tipo di ordinamento perché di solito non è necessario. Non si desidera aggiungere qualcosa al modello di dati a meno che non sia necessario simulare l'oggetto, l'evento o la condizione del mondo reale descritti dal modello.Solitamente, l'ordinamento/l'ordinamento non è inerente al modello, ma semplicemente richiesto dall'interfaccia utente/vista. In tal caso, dovresti avere la logica di ordinamento nel controller tra il modello e la vista.

Pensa attentamente prima di aggiungere l'ordine al modello quando potresti non averne bisogno.

+0

Se si utilizza un elenco collegato, come si imposta il descrittore di ordinamento dei dati principali? Un punto dell'utilizzo di Core Data (ovvero un 'NSFetchedResultController') è che ti consegnerà i risultati di una query nell'ordine corretto se fornisci un descrittore di ordinamento. –

+0

L'ordinamento è inerente ai dati, deciso solo dall'utente. Pensa ad esempio che vuoi lasciare che l'utente decida in quale ordine vuole che i suoi libri vengano messi sul suo scaffale. Potrebbe decidere di spostare un libro dalla posizione 7 alla posizione 14 e 15. Oppure vendere il libro nella posizione 12, o acquistare un nuovo libro e inserirlo nella posizione 3. Il giorno dopo, deciderà di spostare quel libro fino alla fine dello scaffale. L'interfaccia utente per farlo è facile usando un 'UITableView'. Il mio problema è con la migliore rappresentazione di tale "valore di preferenza" per rendere lo scambio/inserimento/cancellazione facile e abbastanza veloce. –

+0

Penso che una lista collegata combinata con l'indice divisibile sarebbe la più veloce. Per una maggiore velocità, sposterei l'ordine su un'altra entità leggera con una relazione all'entità che si desidera ordinare. Effettua il prelievo e l'ordinamento sull'entità leggera e quindi carica l'entità associata secondo necessità. – TechZen

Problemi correlati