创建表后SQLite文件不更新

时间:2015-12-06 00:08:10

标签: java sqlite maven tomcat spring-web

好的,情况就是这样。我重用了一个来自不同项目的代码,我检查了某个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时找到的表(通过打印出rs.getString(3))。

然而,当我查看数据库文件时(在src/main/resources/example.dbtarget/classes/example.dbWEB-INF/classes/example.db中的warfile内部,我想到的所有可能位置),文件都不会更新。在所有这些位置,它仍然是0字节大小。

我做错了什么?为什么表没有写入这些文件?

我在我的pom文件中使用和不使用此代码运行代码

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

1 个答案:

答案 0 :(得分:0)

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

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