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不能看到写在当前会话中的数据呢?
我注意到您正在使用驱动程序管理器来获取SQLConnection。 您可能忘记在驱动程序管理器中注册SQL驱动程序。 你应该有这样的地方在你的代码(你只需做一次):
DriverManager.registerDriver(new org.sqlite.JDBC());
编辑:
你在你的代码中的小bug:你写双打和阅读整数。 测试我已经创建了一个表“测试”与类型双列“val”。
在每次运行程序时,一个新的行写在输出:
0
0
0
这是运行程序3次后的输出。数据库有3行,并且每次运行程序时都会添加一个(0值是因为您正在读取来自double值的整数,并随机返回0到1之间的值)。
我唯一的解释可能是SQLite驱动程序中的一个错误。
如果使用'classForName'加载它,Theres不需要注册驱动程序。否则会有例外。 – gorootde 2012-07-06 12:42:54
是的,你是对的。您可以手动注册驱动程序,也可以使用classForName加载驱动程序类,并且驱动程序将向驱动程序管理器注册。我目前正在尝试运行你的代码,看看我是否可以复制这个问题。 – 2012-07-06 12:53:15
您的代码对我来说工作正常,无法复制问题。请参阅上面对我的回答的编辑。问题可能是你的sqlite驱动程序。 – 2012-07-06 13:50:21
>那么为什么SQLite看不到写在当前会话中的数据呢? 由于您正在关闭连接并在每次读取或写入内容时重新打开它,因此不再是同一个会话。但我想问题是,驱动程序管理器无法解析您的连接URL,并且没有任何内容真正写入文件。你有没有任何SQLException? – 2012-07-06 12:40:36
根本没有例外。一旦我关闭应用程序,数据就会被写入。如果不是,重启后它不会在那里。如果我正在使用sqlite命令行工具进行选择,则在关闭我的应用程序之前,我也无法看到数据。 – gorootde 2012-07-06 12:47:18