我有以下问题,这让我忙了一段时间
我正在Netbeans中构建一个Java项目,我在这个项目中使用了一个嵌入式sqlite DB
当前DB位于包src/release/
中。
我通过以下方式引用代码中的数据库:
c = DriverManager.getConnection("jdbc:sqlite:src/release/db.db3");
当我在Netbeans中运行该项目时,它可以毫无问题地运行。但是当我尝试构建它并运行创建的jar文件(在dist文件夹中(时。
我收到以下错误消息(翻译自荷兰语描述(:
打开连接失败:到的路径scr/release/db.db3:'C:\users\idxxxxx\Documents\\dist\src'不存在
在代码中引用DB时,如下所示:c = driverManager.getConnection("jdbc:sqlite:db.db3");
将db文件添加到输出目录的根目录中(因此不在jar本身中(,应用程序可以部分工作,但我的应用程序中缺少一些db数据(空的组合框(
因此,似乎也存在一个问题。
我的问题是:
- 如何在netbeans中添加一个嵌入的db-sqlite,使其成为我的项目的一部分
- 我应该把数据库文件放在哪里?如何在项目代码中引用它
我不希望最终用户在他将收到的文件中看到任何数据库文件
因此,如果可能的话,我希望数据库文件成为.jar的一部分。
Tnx
SQLite需要单独的文件,即使不需要更新数据库。
Need确保锁定并确保数据库ACID属性。
来自内部的SQLite.jar
- SQLite设计用于直接访问文件
- SQLite可能需要在某些环境中不可用的额外权限
SQLite数据文件可以在启动时从JAR中提取到一个临时位置。
将数据库url直接写入程序不是一个好的选择。
getConnection("jdbc:sqlite:src/release/db.db3");
让您的应用程序查找该文件。如果未找到:error: File db.db3 not found
消息。然后了解用户,不是程序出错,而是缺少数据库文件。
由于您使用的是java,因此创建动态url很容易
例如CCD_ 6
然后应用程序知道将提取的文件(来自jar的db.db3(复制到哪里。
从.jar中提取SQlite
- 你可以让java为你做这件事
- 使用
jdbc:sqlite::resource:
- 您需要sqlitejdbcJAR,因此提取JAR文件并添加到应用程序JAR中
DB文件将被提取到临时文件夹System.getProperty(“java.io.tmpdir”)
中。
例如
[...]
import org.sql.*;
import org.sqlite.*;
[...]
try {
Class.forName("org.sqlite.JDBC");
SQLiteConfig config = new SQLiteConfig();
config.enableFullSync(true);
config.setReadOnly(false);
SQLiteDataSource ds = new SQLiteDataSource(config);
ds.setUrl("jdbc:sqlite::resource:"+
getClass().getResource("db.db3").toString());
conn = ds.getConnection();
}catch(SQLException se)
{
System.out.println("SQLError: "...");
}
更新2014年10月
org.sqlite SQLiteConfig+SQLiteDataSource
2014年10月8日:sqlite-jdbc-3.8.6.jar更新为sqlite3.8.6