好的,情况就是这样。我重用了来自不同项目的一段代码,在该项目中我检查了某个表是否存在于某个 sqlite db 文件中。如果没有,它将创建表。
然后代码工作了,我没有对文件添加重大更改,所以我很困惑没有数据写入文件。
在我运行代码之前,我必须创建一个空的数据库文件,我将它放在 src/main/resources 中,命名为 example.db
public class DBStuff{
protected Connection c = null;
private final String fileName;
public DBStuff(String fileName) {
this.fileName = fileName;
checkDB();
}
protected void startConnection() {
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite::resource:" + fileName);
c.setAutoCommit(false);
} catch (SQLException | ClassNotFoundException ex) {
Logger.getLogger(DBStuff.class.getName()).log(Level.SEVERE, null, ex);
}
}
protected void closeConnection() {
try {
c.close();
} catch (SQLException ex) {
Logger.getLogger(DBStuff.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void checkDB() {
startConnection();
checkTable("firsttable", "CREATE TABLE firsttable"
+ "(id TEXT PRIMARY KEY NOT NULL, "
+ " stuff TEXT NOT NULL)";
checkTable("secondtable", "CREATE TABLE secondtable "
+ "(id TEXT NOT NULL, "
+ " stuffId TEXT NOT NULL, "
+ " specificStuff TEXT NOT NULL, "
+ " CONSTRAINT pk_idstuffId PRIMARY KEY (id,stuffId),"
+ " CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES firsttable(id))");
closeConnection();
}
private void checkTable(String dbName, String sql) {
try {
ResultSet rs;
boolean exists = false;
DatabaseMetaData md = c.getMetaData();
rs = md.getTables(null, null, "%", null);
while (rs.next()) {
if (rs.getString(3).equals(dbName)) {
exists = true;
break;
}
}
if (!exists) {
Statement stmt;
stmt = c.createStatement();
stmt.executeUpdate(sql);
stmt.close();
c.commit();
}
} catch (SQLException ex) {
Logger.getLogger(DBStuff.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
我使用创建了一个 DBStuff 对象
DBStuff dbstuff = new DBStuff("example.db");
我已经用 print 语句验证了在第二次运行 checkDB 时找到了这些表(通过 print out rs.getString(3)
)。
但是,当我查看数据库文件时(在我能想到的所有可能的位置, insrc/main/resources/example.db
和target/classes/example.db
in 的 warfile 中WEB-INF/classes/example.db
),该文件没有更新。在所有这些位置,它的大小仍然为 0 字节。
我究竟做错了什么?为什么表没有写入这些文件?
我在我的 pom 文件中运行了有和没有这个的代码
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>