わかりました、これが状況です。特定の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");
checkDB が 2 回目に実行されたときにテーブルが見つかることを print ステートメントで確認しました (を出力してrs.getString(3)
)。
しかし、データベース ファイル (考えられるすべての場所、src/main/resources/example.db
、target/classes/example.db
および の warfile 内WEB-INF/classes/example.db
) を見ると、ファイルは更新されていません。これらすべての場所で、サイズはまだ 0 バイトです。
私は何を間違っていますか?これらのファイルにテーブルが書き込まれないのはなぜですか?
pomファイルでこれを使用する場合と使用しない場合の両方でコードを実行しました
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>