我正在使用一个名为SQLiteJDBC的SQLite Java包装器 - 这可能会对任何答案产生影响......
我有一个表格,我已经在GUI中显示,在该UI中我有一个按钮,用于该表的单个行的字段。当我保存更改时,我会这样做......
Statement stmt = connection.createStatement();
stmt.execute("update 'tableName' set 'fieldName'=1 where userid=1");
int updateCount = stmt.getUpdateCount();
我的连接有效,我没有抛出异常,getUpdateCount()返回'1'表示已经更新了一行。但是我的表格没有更新。我花了最后几个小时试图弄清楚发生了什么,但我没有运气。帮助!
更新
问题似乎是它没有提交我所做的更改。在应用程序运行时,我的更改是可见的,但只要我关闭应用程序并重新打开它或直接检查数据库,我的更改就会丢失,我们又回到原点。发生了什么事???
自动提交设置为true,如果我将其设置为false并尝试提交,则会抛出异常。
答案 0 :(得分:5)
我的问题是我依靠垃圾收集器来清理我使用过的ResultSet,我没有明确地关闭它们。
在SQLite中访问一个表会锁定整个数据库,因此这些使用仍然“打开”的ResultSet会阻止我在读取其内容后获得对表的写访问权。
如果您遇到此问题并且正在使用SQLite,请在完成后对每个ResultSet调用close()。 (您可能也想尝试对任何PreparedStatements执行相同操作,我假设这些也会关闭他们用于创建的任何ResultSet,但我还没有尝试验证这一点。)
答案 1 :(得分:3)
我使用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
周围的单引号?
否则这些将被视为字符串,这没有任何意义。来自documentation:
通过将字符串括在单引号(')
中形成字符串常量