Comment puis-je resequence un index primaire dans SQLite pour une utilisation avec un UITableView?

StackOverflow https://stackoverflow.com/questions/1791805

  •  22-09-2019
  •  | 
  •  

Question

Je suis nouveau à SQLite donc s'il vous plaît soyez patient:)

J'ai un UITableView lire les données à partir d'un sqlite db. Si je supprime un enregistrement, la ligne dans la db est supprimée. Le problème est que les autres lignes garder leurs clés primaires, ainsi, par exemple, j'ai 3 lignes et les clés primaires sont 1,2,4. est-il possible de mettre à jour les clés pour être 1,2,3?

Merci beaucoup!

edit: je crée ma table avec:

CREATE TABLE mytable (ID INTEGER PRIMARY KEY  AUTOINCREMENT, value1 TEXT);
Était-ce utile?

La solution

Utilisez REINDEX . (REINDEX ne reconstitue la structure d'index, il ne modifie pas les valeurs des index.)

Utilisez l'ordre des lignes comme un indice implicite

Plutôt que d'essayer de changer les valeurs d'index d'un tas de lignes, pourquoi ne pas effectuer une cartographie de l'ordre de tri?

Utilisez une instruction SELECT comme:

NSString* query = @"SELECT * FROM myTable ORDER BY id LIMIT 1 OFFSET %d";
query = [NSString stringWithFormat:query, indexPath.row + 1];

Pour supprimer une ligne faire quelque chose comme:

NSString* query = @"DELETE FROM myTable WHERE ID = (SELECT ID FROM myTable ORDER BY ID LIMIT 1 OFFSET %d)";
query = [NSString stringWithFormat:query, indexPath.row + 1];

Pour insérer, effectuer une insertion régulière comme d'habitude.

De cette façon, lorsque vous supprimez une ligne, vous ne finissent pas avoir besoin de modifier chaque ligne qui a un plus grand diamètre que la ligne vous supprimez. Ce sera beaucoup plus rapide.

Assurez-vous de mettre à jour votre point de vue de la table chaque fois qu'un changement dans la base de données se produit pour maintenir l'affichage du tableau conforme à la DB.

Cela a aussi l'agréable effet secondaire de garder votre point de vue de la table triée.

Définir un déclencheur pour changer les index concernés

Si vous voulez vraiment garder les index afin qu'ils sont une série parfaite (i.e. .: 1,2,3,4, ...)

Vous pouvez définir un déclencheur de suppression comme ceci:

CREATE TRIGGER reindex AFTER DELETE ON myTable FOR EACH ROW
BEGIN
    UPDATE myTable SET ID = old.ID - 1 WHERE ID > old.ID;
END;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top