Sqlite + Java:表没有更新
我正在使用SQLite的Java包装器,称为SQLiteJDBC – 这可能与任何答案有关…
我有一个表,我已经在GUI中显示,在该UI中,我有一个按钮,用于该表的单个行的字段。 当我保存更改时,我这样做……
Statement stmt = connection.createStatement(); stmt.execute("update 'tableName' set 'fieldName'=1 where userid=1"); int updateCount = stmt.getUpdateCount();
我的连接有效,我没有抛出exception,getUpdateCount()返回’1’表示已经更新了一行。 但是我的表格没有更新。 我花了最后几个小时试图弄清楚发生了什么,但我没有运气。 帮帮我!!
UPDATE
问题似乎是它没有做出我所做的改变。 在应用程序运行时,我的更改是可见的,但只要我关闭应用程序并重新打开它或直接检查数据库,我的更改就会丢失,我们又回到原点。 这是怎么回事??!
自动提交设置为true,如果我将其设置为false并尝试提交,则会抛出exception。
我的问题是我依靠垃圾收集器来清理我使用过的ResultSet,我没有明确地关闭它们。
在SQLite中访问一个表会锁定整个数据库,因此这些使用仍然“打开”的ResultSet会阻止我在读取其内容后获得对表的写访问权。
如果您遇到此问题并且正在使用SQLite,则只需在完成后调用每个ResultSet上的close()。 (您可能也想尝试对任何PreparedStatements执行相同的操作,我假设这些也会关闭他们用于创建的任何ResultSet,但我还没有尝试validation这一点。)
我使用sqlitejdbc-v056.jar尝试了你的例子,它工作正常,即使使用单引号也是如此。
您可以重写您的调用以使用executeUpdate
,但这不会产生任何影响:
int updateCount = stmt.executeUpdate("update 'tableName' set 'fieldName'=1 where userid=1");
确保使用setAutoCommit
(无论如何应该默认为true
)
connection.setAutoCommit(true);
或者在更新后明确地执行commit
:
connection.commit();
仔细检查您是否正在连接到正确的数据库。 如果问题仍未解决,请尝试在更新之前和之后对该记录执行SELECT
,以查看该值是否已更改。
原始答案 :
您是否尝试删除tableName
和fieldName
周围的单引号?
否则,这些将被视为字符串,这没有任何意义。 从文档:
通过将字符串括在单引号(’)中形成字符串常量