如何将SQLite数据库包含在可执行的Jar文件中?

31

我创建了一个Swing应用程序,它使用SQLite作为本地数据库。数据库文件位于项目的根目录中。

Project/DatabaseFile

在Eclipse上应用程序运行良好,但当我运行已打包的可执行Jar文件时,我会收到以下错误:

No such table : table1

这意味着数据库无法访问。当我检查了生成的JAR文件内容时,数据库文件不在其中。

在代码中,我已经按照以下方式链接了数据库:

jdbc:sqlite:DatabaseFile

我的问题是,如何将SQLite数据库包含在可执行的Jar文件中?

编辑

当我将DB文件放在源文件夹项目/ src / DatabaseFile 中并将路径更改为jdbc:sqlite:src/DatabaseFile时,它在Eclipse上运行正常,但当我作为java -jar Project.jar 运行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;
}

你是否将这个 jar 文件添加到项目中的源文件夹中?我猜这可能会有所帮助。我希望这个 答案 能对你有所帮助。 - nIcE cOw
我已经将数据库添加到src文件夹中(请参见更新)。有没有办法将其作为文件连接到数据库,而不是使用con = DriverManager.getConnection("jdbc:sqlite:src/DatabaseFile");? - Momo
源文件夹并不意味着 arc 文件夹,相反右键单击您的项目->新建->源文件夹。我现在离开了我的电脑,否则可能会自己查看它,至少为您提供一个可工作的示例。 - nIcE cOw
我曾尝试在Eclipse上使用我的SQL Server驱动程序来完成这个任务,我发现了如何将.jar文件添加到您的项目中。如果您需要详细的步骤说明,我可以将其作为答案描述给您,一步一步地讲解。您可以根据自己的情况更改连接代码和.jar文件。 - nIcE cOw
2个回答

46

你正在使用哪个SQLite库?

根据您提供的连接URI,我进行了搜索并找到了这个。在文档中指出:

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

如果您正在使用该驱动程序,则建议使用以下连接URI:

"jdbc:sqlite::resource:DatabaseFile"

关键在于,由于您的数据库是在jar文件中,因此无法像使用FileInputStream访问文件一样进行访问。相反,必须通过JVM对其的支持来进行访问(即使用Class.getResource()Class.getResourceAsStream())。请注意,存储在jar文件中的资源是只读的。您将无法保存任何更改到数据库中。


3
我之前使用的是sqlitejdbc-v056。后来我将它改为sqlite-jdbc-3.6.14.1,并使用路径"jdbc:sqlite::resource:DatabaseFile"连接到数据库(数据库文件在src文件夹下)。在Eclipse和导出的Jar文件中都可以正常工作。谢谢。 - Momo
这个答案的价值远远超过一个+1。谢谢。 - Dan

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目录下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接