SQLite(JDBC)不写数据

问题描述:

我有一个应用程序读写数据到sqlite数据库。在某些情况下,我必须写入一些数据,并在数据库中尽快读取这些数据。看下面的例子。SQLite(JDBC)不写数据

public void read() throws SQLException { 
    Connection c = DriverManager.getConnection("jdbc:sqlite:C:\\test.sqlite"); 
    c.setAutoCommit(false); 
    try { 
     PreparedStatement p = c.prepareStatement("SELECT * FROM test"); 
     try { 
      ResultSet rs = p.executeQuery(); 
      try { 
       while (rs.next()) { 
        System.out.println(rs.getInt("val")); 
       } 
      } finally { 
       rs.close(); 
      } 
     } finally { 
      p.close(); 
     } 
    } finally { 
     c.close(); 
    } 
} 

public void write() throws SQLException { 
    Connection c = DriverManager.getConnection("jdbc:sqlite:C:\\test.sqlite"); 
    c.setAutoCommit(false); 
    try { 
     PreparedStatement p = c.prepareStatement("INSERT INTO test (val) VALUES (?)"); 
     try { 
      p.setDouble(1, Math.random()); 
      p.executeUpdate(); 
      c.commit(); 
     } finally { 
      p.close(); 
     } 

    } finally { 
     c.close(); 
    } 
} 

public void demonstrate() { 
    write(); 
    read(); 
} 

如果我称之为demonstrate方法中,数据被写入没有任何异常,但读法输出在标准输出上什么都没有。如果我重新启动应用程序,我可以看到最后一次运行中写入的数据。 上面显示的示例已被简化。在实际的应用程序中,每个查询要写入的数据要多得多。

那么为什么SQLite不能看到写在当前会话中的数据呢?

+0

>那么为什么SQLite看不到写在当前会话中的数据呢? 由于您正在关闭连接并在每次读取或写入内容时重新打开它,因此不再是同一个会话。但我想问题是,驱动程序管理器无法解析您的连接URL,并且没有任何内容真正写入文件。你有没有任何SQLException? – 2012-07-06 12:40:36

+0

根本没有例外。一旦我关闭应用程序,数据就会被写入。如果不是,重启后它不会在那里。如果我正在使用sqlite命令行工具进行选择,则在关闭我的应用程序之前,我也无法看到数据。 – gorootde 2012-07-06 12:47:18

我注意到您正在使用驱动程序管理器来获取SQLConnection。 您可能忘记在驱动程序管理器中注册SQL驱动程序。 你应该有这样的地方在你的代码(你只需做一次):

DriverManager.registerDriver(new org.sqlite.JDBC()); 

编辑:

你在你的代码中的小bug:你写双打和阅读整数。 测试我已经创建了一个表“测试”与类型双列“val”。

在每次运行程序时,一个新的行写在输出:

0 
0 
0 

这是运行程序3次后的输出。数据库有3行,并且每次运行程序时都会添加一个(0值是因为您正在读取来自double值的整数,并随机返回0到1之间的值)。

我唯一的解释可能是SQLite驱动程序中的一个错误。

See my Answer here for a driver update

+1

如果使用'classForName'加载它,Theres不需要注册驱动程序。否则会有例外。 – gorootde 2012-07-06 12:42:54

+0

是的,你是对的。您可以手动注册驱动程序,也可以使用classForName加载驱动程序类,并且驱动程序将向驱动程序管理器注册。我目前正在尝试运行你的代码,看看我是否可以复制这个问题。 – 2012-07-06 12:53:15

+0

您的代码对我来说工作正常,无法复制问题。请参阅上面对我的回答的编辑。问题可能是你的sqlite驱动程序。 – 2012-07-06 13:50:21