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

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

Project/DatabaseFile 

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

 No such table : table1 

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

在代码中,我将数据库链接如下:

 jdbc:sqlite:DatabaseFile 

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

编辑

当我将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; } 

你在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()Class.getResourceAsStream() )。 请注意,jar文件中包含的资源是只读的。 您将无法保存对数据库的任何更改。

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

我找到了解决方案。 你应该在连接后在数据库中创建表。 在你的class级连接这样的。

  public void createDb() throws SQLException { Statement statement = connection.createStatement(); PreparedStatement preparedStatement = connection.prepareStatement("CREATE TABLE IF NOT EXISTS threads `your table`; preparedStatement.executeUpdate(); preparedStatement.close(); } 

因为当程序在jar中编译时,它不会自动在数据库中创建表。

首先,如果不存在,你必须得到连接并创建一个表:

  Connect connect = new Connect(); connect.getConnection(); connect.createDb(); connect.closeConnection();