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");

我已经用 print 语句验证了在第二次运行 checkDB 时找到了这些表(通过 print out rs.getString(3))。

但是,当我查看数据库文件时(在我能想到的所有可能的位置, insrc/main/resources/example.dbtarget/classes/example.dbin 的 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

0

我发现该文件实际上位于target/ProjectName-x.x.x/WEB-INF/classes/example.db

下次给我提示:在我的文件浏览器中使用搜索功能。它会找到您可能永远找不到的东西。

于 2015-12-06T01:14:04.970 回答