ローカル データベースとして SQLite を使用する Swing アプリケーションを作成しました。データベース ファイルはプロジェクトのルート ディレクトリにあります。
Project/DatabaseFile
アプリケーションは Eclipse 上で正常に実行されますが、パッケージ化された実行可能 Jar を実行すると、次のエラーが発生します。
No such table : table1
これは、データベースにアクセスできないことを意味します。生成された JAR ファイルの内容を調べたところ、データベース ファイルはそこにありませんでした。
コードでは、次のようにデータベースをリンクしました。
jdbc:sqlite:DatabaseFile
私の質問は、実行可能 Jar に SQLite データベースを含めるにはどうすればよいかということです。
編集
DB ファイルをソース フォルダに配置しProject/src/DatabaseFile
、パスを に変更するとjdbc:sqlite:src/DatabaseFile
、Eclipse では動作しましたが、Jar ファイルを として実行すると再び動作しませんでしたjava -jar Project.jar
。次のように表示されました。
path to 'src/DatabaseFile': 'C:\Users\name\src' does not exist
データベースの相対パスを指定する必要があると思います。
編集
データベースに接続する方法は次のとおりです。
public Connection getConnection(){
try{
Class.forName("org.sqlite.JDBC").newInstance();
con = DriverManager.getConnection("jdbc:sqlite:src/DatabaseFile");
} catch (Exception e) {
Log.fatal("Méthode: getConnection() | Class : SQLiteConnection | msg system : " + e.getMessage());
}
return con;
}
ベストアンサー1
SQLite ではどのライブラリを使用していますか?
ご指定の接続URIに基づいて検索したところ、これです。 の中にドキュメンテーションそれはこう言います:
2009年5月19日: sqlite-jdbc-3.6.14.1 がリリースされました。このバージョンでは、JAR アーカイブに含まれる読み取り専用 DB ファイル、または URL、ローカル ファイル アドレスなどによって指定された外部リソースにアクセスするための "jdbc:sqlite::resource:" 構文がサポートされています (詳細)
使用しているドライバーがこれである場合は、次の接続 URI をお勧めします。
"jdbc:sqlite::resource:DatabaseFile"
重要なのは、データベースがjarファイル内にあるため、ファイルとしてアクセスできないことですFileInputStream
。代わりに、JVMのサポートを介してアクセスする必要があります(つまり、Class.getResource()
またはClass.getResourceAsStream()
)。jar ファイル内に含まれるリソースは読み取り専用であることに注意してください。データベースに変更を保存することはできません。