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?
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). –
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: - / –