Sqlite + Java:表没有更新

时间:2010-03-18 20:03:08

标签: java sqlite

我正在使用一个名为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并尝试提交,则会抛出异常。

2 个答案:

答案 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,在之后执行,以查看值是否已更改。


原始回答

您是否尝试删除tableNamefieldName周围的单引号?

否则这些将被视为字符串,这没有任何意义。来自documentation:

  

通过将字符串括在单引号(')

中形成字符串常量