30

我创建了一个使用 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;
}
4

2 回答 2

46

你用什么库来做 SQLite?

我根据您指定的连接 URI 进行了搜索,找到了这个。在文档中它说:

2009 年 5 月 19 日:sqlite-jdbc-3.6.14.1 发布。此版本支持“jdbc:sqlite::resource:”语法来访问包含在 JAR 档案中的只读 DB 文件,或通过 URL、本地文件地址等指定的外部资源(另见详细信息

如果那是您正在使用的驱动程序,那么我建议使用以下连接 URI:

"jdbc:sqlite::resource:DatabaseFile"

关键是,由于您的数据库位于 jar 文件中,因此无法将其作为带有FileInputStream. 相反,它必须通过 JVM 对它的支持(即使用Class.getResource()or Class.getResourceAsStream())来访问。请注意,jar 文件中包含的资源是只读的。您将无法保存对数据库的任何更改。

于 2012-08-19T15:40:32.863 回答
3

我找到了两种不同的方法来命名文件路径,具体取决于您尝试访问它的方式。假设您正在访问的数据库位于 /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);

您的方式也有效...通过将数据库放入 /src

于 2013-03-07T06:19:18.140 回答