【问题标题】:SQLite file not updating after table creation创建表后 SQLite 文件未更新
【发布时间】:2015-12-06 00:08:09
【问题描述】:

好的,情况就是这样。我重用了来自不同项目的一段代码,在该项目中我检查了某个表是否存在于某个 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.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>

【问题讨论】:

    标签: java sqlite maven tomcat spring-web


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2019-10-27
      • 1970-01-01
      • 2016-04-01
      • 2020-09-13
      相关资源
      最近更新 更多