2010-09-05 15 views
7

Esta pregunta está en el contexto de los datos principales, pero si no me equivoco, se aplica igualmente bien a un caso SQL más general.¿Cómo mantener una tabla ordenada con Core Data (o SQL) con inserciones/eliminaciones?

quiero mantener una tabla ordenada usando datos básicos, con la posibilidad de que el usuario:

  • filas de reabastecimiento
  • inserción de nuevas líneas en cualquier lugar
  • borrar cualquier línea existente

¿Cuál es el mejor modelo de datos para hacer eso? Veo dos maneras:

1) Modelo como una matriz: añado un int position propiedad a mi entidad

2) Modelo como una lista enlazada: añado dos relaciones uno-a-uno, next y previous de mi entidad a sí

1) hace que sea fácil de resolver, pero doloroso para insertar o eliminar como usted entonces tiene que actualizar el position de todos los objetos que vienen después

2) hace que sea fácil insertar o eliminar, pero muy difícil de clasificar. De hecho, no creo saber cómo expresar un descriptor de ordenamiento (cláusula SQL ORDER BY) para ese caso.

Ahora me puedo imaginar una variación de 1):

3) añadir un int ordering propiedad a la entidad, pero en lugar de tener que contar uno por uno, tiene que contar 100 por 100 (por ejemplo,) Entonces, insertar es tan simple como encontrar cualquier número entre el orden de los objetos existentes y anteriores. La costosa renumeración solo tiene que ocurrir cuando se hayan llenado los 100 agujeros. Hacer que esa propiedad sea flotante en lugar de int lo hace aún mejor: casi siempre es posible encontrar un nuevo flotador a medio camino entre dos flotadores.

¿Estoy en el camino correcto con la solución 3), o hay algo más inteligente?

Respuesta

0

Desde iOS 5 puede (y debe) utilizar NSOrderedSet y su subclase mutable. → Core Data Release Notes for OS X v10.7 and iOS 5.0

Ver la respuesta aceptada en How can I preserve an ordered list in Core Data.

+1

Sí. Sacaste una vieja pregunta, y tienes razón :-). A pesar de algunos problemas con NSOrderedSet (que tiene una API que es menos completa que NSArray, por ejemplo) y las relaciones ordenadas (que creo que no son totalmente compatibles con los controladores de resultados obtenidos). –

+0

Sí, intenté hacer que NSFetchedResultsController trabajara con una relación ordenada. Con éxito en su mayor parte, pero no logré actualizar de forma inteligente la vista de tabla, es decir, animando la inserción o eliminación, en lugar de hacer simplemente '[tableView reloadData]' ... Así que al final abandoné los controles de resultados obtenidos y simplemente pre-revisé todo lista: - / –

4

Si el orden es arbitrario, es decir, no inherente a los datos que se modelan, no tiene más remedio que agregar un atributo o relación para mantener el orden.

Recomendaría la lista vinculada, ya que es más fácil de mantener. No estoy seguro de lo que quiere decir con una lista vinculada que es difícil de ordenar, ya que lo más probable es que no esté ordenando un orden arbitrario de todos modos. En cambio, solo irás a buscar la instancia más alta y caminarás hacia abajo.

Ordenar por un atributo flotante divisible es una buena idea. Puede crear un número casi infinito de índices intermedios simplemente restando el índice existente más bajo del índice existente más alto, dividiendo el resultado por dos y luego agregando ese resultado al índice más bajo.

También puede combinar un índice divisible con una lista vinculada si necesita un pedido de tablas o similar. La lista enlazada facilitaría la búsqueda de índices existentes y el índice divisible facilitaría la ordenación si fuera necesario.

Datos básicos resisten este tipo de pedido porque generalmente no es necesario. No desea agregar algo al modelo de datos a menos que sea necesario simular el objeto, evento o condición del mundo real que describe el modelo.Por lo general, ordenar/clasificar no es inherente al modelo, sino que simplemente lo necesita la interfaz de usuario/vista. En ese caso, debe tener la lógica de clasificación en el controlador entre el modelo y la vista.

Piénselo detenidamente antes de agregar el pedido al modelo cuando no lo necesite.

+0

Si utiliza una lista vinculada, ¿cómo configuraría el descriptor de ordenación de datos centrales? Un punto de uso de Core Data (es decir, un 'NSFetchedResultController') es que le entregará los resultados de una consulta en el orden correcto si le proporciona un descriptor de ordenación. –

+0

El orden de clasificación es inherente a los datos, solo lo decide el usuario. Piensa, por ejemplo, que quieres que el usuario decida en qué orden él quiere que sus libros se pongan en su estante. Podría decidir mover un libro de la posición 7 a la posición 14 o 15. O vender el libro en la posición 12, o comprar un libro nuevo e insertarlo en la posición 3. Al día siguiente, ella decidirá mover ese libro hasta el final del estante. La interfaz de usuario para hacer eso es fácil usando un 'UITableView'. Mi problema es con la mejor representación de dicho "valor de preferencia" para hacer que el intercambio/inserción/eliminación sea lo suficientemente fácil y rápido. –

+0

Creo que una lista vinculada combinada con el índice divisible sería la más rápida. Para una mayor velocidad, movería el pedido a otra entidad liviana con una relación con la entidad que desea pedir. Haz tus búsquedas y ordena en la entidad liviana y luego carga la entidad asociada según sea necesario. – TechZen

Cuestiones relacionadas