0

わかりました、これが状況です。特定の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.dbtarget/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>
4

1 に答える 1