2010-03-18 8 views
2

J'utilise un wrapper Java pour SQLite appelé SQLiteJDBC - cela peut avoir une incidence sur toutes les réponses ...Sqlite + Java: table non mise à jour

J'ai une table que j'ai affiché dans une interface graphique, à l'intérieur de cette interface, j'ai un bouton pour les champs d'une ligne individuelle de cette table. Quand je sauve mes changements que je fais ...

Statement stmt = connection.createStatement(); 
stmt.execute("update 'tableName' set 'fieldName'=1 where userid=1"); 

int updateCount = stmt.getUpdateCount(); 

Ma connexion est valide, je reçois aucune exception et jetés retourne « 1 » getUpdateCount() indiquant qu'une ligne a été mis à jour. Cependant, ma table n'est pas mise à jour. J'ai passé les dernières heures à essayer de comprendre ce qui se passe, mais je n'ai pas de chance. Aidez-moi!!

MISE À JOUR

Le problème semble être que ce n'est pas commettre les changements que je fais. Pendant que l'application est en cours d'exécution mes modifications sont visibles mais dès que je ferme l'application et la rouvre ou vérifie la base de données directement mes modifications sont perdues et nous sommes de retour à la case départ. Que se passe-t-il??!

La validation automatique est définie sur true et si je la mets à false et que j'essaie de valider, une exception est levée.

+0

tableName et fieldName sont des variables ou le nom réel de votre table et champ? si les variables sont juste à concaténer – LB40

Répondre

5

Mon problème était que je comptais sur le garbage collector pour éclaircir mes ResultSets utilisés, j'étais ne les ferme pas explicitement.Dans SQLite, l'accès à une table verrouille toute la base de données de sorte que les ResultSets utilisés qui étaient encore 'ouverts' m'empêchaient d'obtenir un accès en écriture à une table après avoir lu son contenu.

Si vous avez ce problème et que vous utilisez SQLite, appelez close() sur chaque ResultSet lorsque vous avez terminé. (Vous voudrez peut-être essayer de faire la même chose avec PreparedStatements, je suppose que ceux-ci ferment également tous les ResultSets qu'ils ont créés mais je n'ai pas expérimenté pour les vérifier.)

+0

+1, a eu le même problème un c'était vraiment utile! –

3

J'ai essayé votre exemple en utilisant sqlitejdbc-v056.jar et cela a bien fonctionné, même en utilisant les guillemets simples.


Vous pouvez réécrire votre appel à utiliser executeUpdate, mais cela ne devrait pas faire une différence:

int updateCount = 
     stmt.executeUpdate("update 'tableName' set 'fieldName'=1 where userid=1"); 


Assurez-vous d'utiliser setAutoCommit (devrait par défaut true de toute façon)

connection.setAutoCommit(true); 

ou pour effectuer un commit explicitement après la mise à jour:

connection.commit(); 


Vérifiez que vous vous connectez à la bonne base de données. Si le problème n'est toujours pas résolu, essayez d'effectuer un SELECT sur cet enregistrement avant et après la mise à jour pour voir si la valeur a changé.


réponse originale:

Avez-vous essayé d'enlever les guillemets simples autour de votre tableName et fieldName?

Ceux-ci seraient traités comme des chaînes sinon, ce qui ne fait aucun sens. De l'documentation:

est formé une chaîne constante en enfermant la chaîne entre guillemets simples (')

+0

Le SQL que j'ai ci-dessus fonctionne bien pour mon exemple réel où le nom de la table est de la forme 'foo.bah'. Utiliser des guillemets avec 'fieldName' est certes inutile, mais semble fonctionner correctement avec ou sans. –

+0

@Ben L: S'il vous plaît vérifier ma réponse éditée. –