SQLite 文件在 table 创建后未更新
SQLite file not updating after table creation
好的,情况是这样的。我重复使用了另一个项目中的一段代码,在该项目中我检查了某个 sqlite db 文件中是否存在 table。如果没有,它将创建 table.
当时代码有效,我没有对文件进行重大更改,所以我很困惑没有数据写入文件。
在我 运行 代码之前,我必须创建一个空的数据库文件,我把它命名为 example.db
src/main/resources
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 第二次为 运行 时找到了 table(通过打印出 rs.getString(3)
)。
然而,当我查看数据库文件时(在我能想到的所有可能位置,在 src/main/resources/example.db
、target/classes/example.db
和 WEB-INF/classes/example.db
的 warfile 中),文件是没有更新。在所有这些位置,它的大小仍然是 0 字节。
我做错了什么?为什么 table 没有写入这些文件?
我 运行 我的 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
下次给我提示:使用我的文件浏览器中的搜索功能。它会找到您可能永远找不到的东西。
好的,情况是这样的。我重复使用了另一个项目中的一段代码,在该项目中我检查了某个 sqlite db 文件中是否存在 table。如果没有,它将创建 table.
当时代码有效,我没有对文件进行重大更改,所以我很困惑没有数据写入文件。
在我 运行 代码之前,我必须创建一个空的数据库文件,我把它命名为 example.db
src/main/resourcespublic 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 第二次为 运行 时找到了 table(通过打印出 rs.getString(3)
)。
然而,当我查看数据库文件时(在我能想到的所有可能位置,在 src/main/resources/example.db
、target/classes/example.db
和 WEB-INF/classes/example.db
的 warfile 中),文件是没有更新。在所有这些位置,它的大小仍然是 0 字节。
我做错了什么?为什么 table 没有写入这些文件?
我 运行 我的 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
下次给我提示:使用我的文件浏览器中的搜索功能。它会找到您可能永远找不到的东西。