Cette question est dans le contexte des données de base, mais si je ne me trompe pas, elle s'applique aussi bien à un cas SQL plus général.Comment gérer une table ordonnée avec Core Data (ou SQL) avec des insertions/suppressions?
Je veux maintenir une table ordonnée à l'aide de base de données, avec la possibilité pour l'utilisateur:
- lignes de Réorganiser
- insérer de nouvelles lignes partout
- supprimer toute ligne existante
Quel est le meilleur modèle de données pour cela? Je vois deux façons:
1) Modèle comme un tableau: ajouter un int position
propriété à mon entité
2) Modèle comme une liste chaînée: ajouter deux one-to-one relations, next
et previous
de mon entité se
1), il est facile de trier, mais douloureux pour insérer ou supprimer comme vous devez alors mettre à jour le position
de tous les objets qui viennent après
2), il est facile à insérer ou supprimer, mais très difficile à trier. En fait, je ne pense pas savoir comment exprimer un Descripteur de Sort (clause SQL ORDER BY
) pour ce cas.
Maintenant, je peux imaginer une variation sur 1):
3) ajouter un int ordering
propriété à l'entité, mais au lieu de l'avoir compter un par un, l'ont compte 100 par 100 (par exemple). Ensuite, l'insertion est aussi simple que de trouver n'importe quel nombre entre l'ordre des objets existants précédent et suivant. La renumérotation coûteuse ne doit avoir lieu que lorsque les 100 trous ont été remplis. Faire de cette propriété un flotteur plutôt qu'un int le rend encore meilleur: il est presque toujours possible de trouver un nouveau flotteur à mi-chemin entre deux flotteurs. Suis-je sur la bonne voie avec la solution 3), ou y a-t-il quelque chose de plus intelligent?
Oui. Tu as creusé une vieille question, et tu as raison :-). Malgré quelques problèmes avec NSOrderedSet (qui a une API qui est moins complète que NSArray par exemple) et des relations ordonnées (qui je crois ne sont pas entièrement supportées par les contrôleurs de résultats récupérés). –
Oui, j'ai essayé de faire fonctionner NSFetchedResultsController avec une relation ordonnée. Succès pour la plupart - mais n'a pas réussi à mettre à jour intelligemment la vue de la table, c'est-à-dire à animer l'insertion ou la suppression, au lieu de simplement faire un [tableView reloadData] ... Donc j'ai abandonné les contrôleurs de résultats récupérés liste :-/ –