java - SQLite 文件在创建表后不更新

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

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

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

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

我在我的 pom 文件中运行了有和没有这个的代码

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

最佳答案

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

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

关于java - SQLite 文件在创建表后不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34112444/

相关文章:

android - 数据库被锁定在 getReadableDatabase() android

从行计算 SQLite 持续时间

javascript - 设置适当的 language_in 选项

java - RestTemplate 不适用于 APPLICATION_FORM_URLENCODED 和请求 Pojo

java - 适用于 Java 的 Firebase 身份验证

java - html 中搜索的正则表达式

maven - “-Dmaven.test.skip.exec”与 “-Dmaven.test.skip=true”和 “-DskipTests”有什么区别?

java - 迭代实例化: n generic lists for n fields in an object

java - 适用于 Android 的 SQLCipher : couldn't find native method

java - Jar 文件位于另一个 jar 错误 NoClassDefFoundError 和 ClassNotFoundException 中