SQLiteをローカルデータベースとして使用するSwingアプリケーションを作成しました。データベースファイルはプロジェクトのルートディレクトリにあります。
Project/DatabaseFile
アプリケーションはEclipseで正常に実行されますが、パッケージ化された実行可能JARを実行すると、次のエラーが発生します。
No such table : table1
これは、データベースに到達できないことを意味します。生成されたJARファイルの内容を調べたところ、データベースファイルはありませんでした。
コードでは、データベースを次のようにリンクしています。
jdbc:sqlite:DatabaseFile
私の質問は、SQLiteデータベースを実行可能なJARに含める方法ですか?
[〜#〜]編集[〜#〜]
ソースフォルダーProject/src/DatabaseFile
にDBファイルを配置し、パスを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;
}
SQLiteにはどのライブラリを使用していますか?
指定した接続URIに基づいて検索を行ったところ、 これ が見つかりました。 documentation には次のように書かれています:
2009 5月19日:sqlite-jdbc-3.6.14.1がリリースされました。このバージョンは、 "jdbc:sqlite :: resource:"構文をサポートして、JARアーカイブに含まれる読み取り専用DBファイル、またはURL、ローカルファイルアドレスなどで指定された外部リソースにアクセスします( detailes も参照)
それがあなたが使用しているドライバーである場合、私は次の接続URIを提案します:
_"jdbc:sqlite::resource:DatabaseFile"
_
重要なのは、データベースがjarファイル内にあるため、FileInputStream
を含むファイルとしてアクセスできないことです。代わりに、JVMのサポートを通じて(つまり、 Class.getResource()
または Class.getResourceAsStream()
を使用して)アクセスする必要があります。 jarファイルに含まれるリソースは読み取り専用であることに注意してください。変更をデータベースに保存することはできません。
アクセスしようとしている方法に応じて、ファイルパスに名前を付ける2つの方法を見つけました。 dbにアクセスしていると仮定すると、/ yourproject/resource /または/ yourproject/bin/resourceにあります(絞り込んでいないので、両方にありますが、満足しています)。これをパスとして使用してください。
//Eclipse test path
String url = "jdbc:sqlite:resource/mydb.db";
または
//runnable jar path
String url = "jdbc:sqlite::resource:mydb.db";
その後
mysqlitedatasource.setUrl(url);
あなたのやり方もうまくいきます... dbを/ srcに置くことによって