代码之家  ›  专栏  ›  技术社区  ›  Ben L

SQLite + Java:表不更新

  •  2
  • Ben L  · 技术社区  · 15 年前

    我使用的是一个SQLite包装器,用于调用SQLite SQLiteJDBC -这可能与任何答案有关…

    我有一个在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 回复  |  直到 15 年前
        1
  •  5
  •   Ben L    15 年前

    我的问题是,我依赖于垃圾收集器来清除我使用过的结果集,而不是显式地关闭它们。

    在sqlite中,访问一个表会锁定整个数据库,因此这些使用过的结果集仍然处于“打开”状态,这会阻止我在读取表的内容后获得对该表的写访问权限。

    如果您有这个问题,并且正在使用sqlite,那么在完成后只需对每个resultset调用close()。(您可能还想尝试对任何preparedstatements执行同样的操作,我假设这些语句也会关闭它们用来创建的任何结果集,但我还没有尝试验证这一点。)

        2
  •  3
  •   Peter Lang    15 年前

    我试过你的例子 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:

    字符串常量是通过将字符串括在单引号(')中形成的。