Как включить базу данных SQLite в исполняемый Jar?
Я создал приложение Swing, которое использует SQLite в качестве локальной базы данных. Файл базы данных находится в корневом каталоге проекта.
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;
}
Ответы
Ответ 1
В какой библиотеке вы используете SQLite?
Я выполнил поиск на основе указанного URI соединения и нашел этот. В документации говорится:
2009 19 мая: выпущен sqlite-jdbc-3.6.14.1. Эта версия поддерживает синтаксис "jdbc: sqlite:: resource:" для доступа к файлам DB только для чтения, содержащимся в архивах JAR, или внешним ресурсам, указанным через URL-адрес, адрес локальных файлов и т.д. (См. Также подробности)
Если это тот драйвер, который вы используете, я бы предложил следующий URI соединения:
"jdbc:sqlite::resource:DatabaseFile"
Ключ состоит в том, что, поскольку ваша база данных находится в файле jar, она не может быть доступна как файл с FileInputStream
. Вместо этого он должен быть доступен через поддержку JVM для него (а именно с Class.getResource()
или Class.getResourceAsStream()
). Обратите внимание, что ресурсы, содержащиеся в файлах jar, доступны только для чтения. Вы не сможете сохранить изменения в своей базе данных.
Ответ 2
Я нашел два разных способа указать путь к файлу в зависимости от того, как вы пытаетесь получить к нему доступ. Предполагая, что вы обращаетесь к db, находится в /yourproject/resource/or/yourproject/bin/resource (havent сузил его, мой - в обоих, и я доволен им), вы должны использовать это как свой путь:
//Eclipse test path
String url = "jdbc:sqlite:resource/mydb.db";
или
//runnable jar path
String url = "jdbc:sqlite::resource:mydb.db";
затем
mysqlitedatasource.setUrl(url);
Ваш способ также работает... путем размещения db in/src
Ответ 3
Я нашел решение. Вы должны CREATE таблицы в базе данных после connectiom.
Как это в вашем классе с подключением.
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();
}
Потому что, когда программа компилируется в банке, она автоматически не создает таблицу в базе данных.
Итак, прежде всего вам нужно получить соединение и создать таблицу, если она не существует:
Connect connect = new Connect();
connect.getConnection();
connect.createDb();
connect.closeConnection();