2010-10-29 6 views
0

Imaginez que j'ai 3 lignes dans une table sqlite.Sqlite - insérer des lignes en les lisant

Lors de la lecture de ces 3 lignes, je souhaite également insérer de nouvelles lignes en fonction des valeurs de ces 3 lignes.

Je fais une sélection sur ces lignes et utilise la fonction sqlite3_step pour obtenir chaque ligne.

Le problème est que sqlite3_step boucle plus de 3 fois, je pense, car il voit aussi les lignes nouvellement insérées. D'une certaine manière le curseur se réinitialise et les mêmes lignes sont lues deux fois, etc.

Comment faire sqlite3_step pour lire seulement 3 lignes? Fondamentalement, je souhaite parcourir uniquement le jeu de résultats et non les nouvelles lignes.

Merci.

Répondre

1

En gros, voici comment j'aborde ce problème.

Je fais les mises à jour & supprime en parcourant toutes les lignes. Mais je ne fais des insertions qu'après avoir fini de traverser.

Merci pour votre aide.

1

sqlite a une fonction qui vous retournera toutes les lignes à la fois; vous pouvez l'utiliser pour obtenir les lignes existantes et ajouter les nouvelles lignes. Cela fait un moment que je l'ai utilisé alors j'oublie le nom de la fonction.

1

Je pense que vous pouvez obtenir le comportement souhaité en démarrant la transaction pour ajouter les lignes avant la boucle qui utilise sqlite3_step pour itérer sur les lignes et valider cette transaction après la boucle.

1

Vous pouvez utiliser une variable pour contenir la dernière ligne insérée (lorsque vous insérez d'abord l'insertion). Si votre objectif est d'arrêter le traitement lorsque le nouvel ensemble est atteint ... Cette valeur est renvoyée lors de l'insertion. Vous pouvez également obtenir la dernière ligne insérée en utilisant;

sqlite3_last_insert_rowid(sqlite3*) 

Si vous voulez garder une trace de quelle ligne il a été qui a déclenché votre insert - simplement stocker est rowid lors de son traitement.

Cela vous donnera une fenêtre valide de lignes à traiter dans

processThisRow = (currentRowId > lastTriggered && currentRowId < firstInserted); 

.. ou vous pourriez peut-être utiliser la transaction distincte comme suggéré ci-dessus.

Hope this helps

Rgrds Anders

Questions connexes