2012-02-17 4 views
-1

Je travaille avec SQLite pour mon application Android et après quelques recherches, j'ai trouvé comment faire plusieurs transactions d'insertion en utilisant l'instruction UNION.Problème d'insertion multiple SQLite

Mais c'est assez inefficace. D'après ce que je vois au http://www.sqlite.org/speed.html, et dans beaucoup d'autres forums, je peux accélérer le processus en utilisant les instructions BEGIN - COMMIT. Mais quand je les utilise je reçois cette erreur:

Cannot start a transaction within a transaction.

Pourquoi? Quelle est la manière la plus efficace de faire plusieurs insertions?

+0

voir si cela vous aide http://stackoverflow.com/a/8027788/1007273 – hovanessyan

Répondre

0

Quel pilote JDBC utilisez-vous? Y en a-t-il un seul dans la distribution Android?

Le problème est très probablement avec java.sql.Connection#setAutoCommit(). Si la connexion a déjà validation automatique activée — que vous pouvez vérifier avec Connection#getAutoCommit() — alors votre pilote JDBC émet déjà les commandes SQL pour démarrer une transaction avant votre tentative manuelle, ce qui rend votre commande manuelle redondante et invalide.

Si vous cherchez à contrôler l'étendue de la transaction, vous devez désactiver mode auto-commit pour la Connection en appelant

connection.setAutoCommit(false); 

puis plus tard, après vos déclarations individuelles DML ont tous été émis, soit valider ou annuler la transaction active via Connection#commit() ou Connection#rollback().

J'ai remarqué que certains pilotes JDBC ont du mal à coordonner le mode de validation automatique avec les méthodes par lots de PreparedStatement. En particulier, the Xerial JDBC driver et the Zentus driver sur lequel il repose à la fois lutter contre un utilisateur contrôlant le mode auto-validation avec l'exécution de l'instruction de traitement par lots.