Подтвердить что ты не робот

Как включить базу данных 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;
}
4b9b3361

Ответ 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();