我在我的 JavaFX 應用程式中使用 SQLite 3 作為資料庫,并且目標是將所有內容打包在一個檔案中(以便用戶除了啟動 .msi 檔案來安裝它之外不需要做任何事情),我把資料庫資源中的檔案,并使用 JPackage 打包我的整個應用程式,問題是安裝它后,資料庫檔案被保存在 C:/Users/username/AppData/Local/Temp 中,這不是存盤重要資料的好地方(我應該提到我的應用程式目錄在 C:/Users/username/Program Files 中符合預期)。
我真的不知道為什么它們會分開(應用程式目錄和資料庫目錄)以及為什么資料庫檔案被保存在一個臨時檔案中,有什么辦法可以更改它們的目錄?
細節 :
我的資料庫連接器:
private Connection connection;
private CashManagementDBConnector(){
try {
connection = DriverManager.getConnection("jdbc:sqlite::resource:DataBases/CashManagement.db");
} catch (SQLException e) {
e.printStackTrace();
}
}
JDBC
我正在使用 xerial SQLite JDBC 3.36.0.3
JDK版本
爪哇17
想法
到目前為止,我認為問題出在 JDBC
uj5u.com熱心網友回復:
SQLite 將資源連接jdbc:sqlite::resource:blah.db視為只讀,因此它將找到的資源復制為目錄中的新資料庫:
System.getProperty("java.io.tmpdir");
如果您不希望這樣,在啟動時,您可以讓代碼檢查任何位置的特定 db 檔案,例如:
Path mydb = Path.of(System.getenv("LOCALAPPDATA"), "MyAppName", "blah.db");
如果上述檔案不存在,您可以將主資源檔案復制到它上面:
final String resName= "/DataBases/CashManagement.db";
if (!Files.isRegularFile(mydb)) {
Files.createDirectories(mydb.getParent()); // if using subdir for app
try(var in = YourClass.class.getResourceAsStream(resName)) {
Objects.requireNonNull(in, () -> "Not found resource: " resName);
Files.copy(in, mydb);
}
}
然后使用 JDBC 驅動程式復制資源:
try(Connection conn = DriverManager.getConnection("jdbc:sqlite:" mydb.toAbsolutePath())) {
...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/376502.html
