Почему я не могу вставить или обновить базу данных SQLite из исполняемого файла JAR?

У меня есть приложение, которое я развертываю как исполняемый файл JAR. Первоначально этот JAR-файл должен был взаимодействовать с базой данных MySQL, но недавно я решил, что вместо этого хочу использовать SQLite. Однако во время тестирования я обнаружил, что не могу вставить или обновить базу данных при запуске моего приложения из файла JAR.

Я использую драйвер JDBC со следующего веб-сайта: http://zentus.com/sqlitejdbc/index.html

Есть ли обходной путь, который я должен сделать?

Драйвер отлично работает при тестировании в моей среде Eclipse, но, похоже, не работает автономно в файле JAR. Любая помощь будет принята с благодарностью.

Ниже приведен фрагмент кода того, что я делаю:

public abstract class AbstractDataUpdator implements DataUpdator{

    protected String description;
    public String[] fieldsToSelect;
    protected String queryString;
    protected String updateString;
    protected String tableName;
    protected String whereStatement;
    protected String groupByStatement;
    protected String orderByStatement;
    protected ResultSet queryResultSet;
    protected Connection connection;
    protected PreparedStatement preparedStatement;
    protected Statement statement;
    protected Database db;
    protected String uri, username, password;
    protected int dbIndex = 0;
    protected static int numInstances = 0;
    protected String countQueryString;
    protected int maxLookupNo = 0;
    protected boolean preparedStatementAlreadyCreated = false;

    AbstractDataUpdator(String description ){
        this.description = description;
        //this.fieldsToSelect = fieldsToSelect;
        //this.tableName = tableName;
        //setupDatabase(databaseName, serverName);

        numInstances++;

    }

    public void setupDatabase(String databaseName, String serverName) {
        // MySQL
        //uri = "jdbc:mysql://"+serverName+"/"+databaseName;

        // SQLite
        uri = "jdbc:sqlite:myfirst_sqlite_db";

        // If there is already a database object in the pool with this information we want to use that object
        // instead of creating another one.
        dbIndex = DatabasePool.getInstance().getIndexOfDatabaseWithThisInfo(uri, username, password);
        if( dbIndex == -1 ){
            db = new Database( uri, username, password );

        }else{
            db = DatabasePool.getInstance().getDatabaseAt(dbIndex);
        }

        try {
            connection = db.getConnection().getConnection();
            connection.setAutoCommit(true);
            statement = connection.createStatement();

        } catch (SQLException e) {
            System.out.println("SQL error occured in setupDatabase() --> "+e.getMessage());
            e.printStackTrace();
        }
    }

    public String executeUpdate(){

        //System.out.println(updateString);

        try {

            if( updateString != null){
                statement.executeUpdate( updateString );
                return null;
            }
            return "update string is null";

        } catch (SQLException e) {
            System.out.println("SQL error occured in executeUpdate()"+e.getMessage());
            return e.getMessage();

        }catch (OutOfMemoryError e){
            System.out.println("out of memory due to execute update function!!!!");
            return e.getMessage();

        }

    }
}

person Brian T Hannan    schedule 29.03.2011    source источник
comment
У вас есть разрешение на запись в папку, в которой вы создаете базу данных sqlite?   -  person Fredrik Wallenius    schedule 30.03.2011
comment
Да, это на моем рабочем столе виртуальной машины. Для файла не установлены разрешения.   -  person Brian T Hannan    schedule 30.03.2011
comment
Что значит не работает? Вы получаете исключения? Просто ничего не происходит? (Используйте e.printStackTrace() вместо e.getMessage(), это обычно дает больше деталей.)   -  person Paŭlo Ebermann    schedule 30.03.2011
comment
Я не верю, что отображается какое-либо сообщение об ошибке, просто данные не сохраняются в базе данных.   -  person Brian T Hannan    schedule 30.03.2011
comment
В ПОРЯДКЕ. «Извлечь БД», по-видимому, не проблема. Как у тебя дела с Джаром? Есть ли у него манифест, определяющий основной класс, чтобы вы могли дважды щелкнуть его, чтобы запустить? Он запускается с помощью JWS? Как апплет? Из командной строки или файла .bat или эквивалентного? (Что я пытаюсь найти, так это - может ли там быть менеджер по безопасности?)   -  person Andrew Thompson    schedule 30.03.2011
comment
Я действительно обнаружил, что он не работает и из Eclipse. По какой-то причине он просто не сохранит данные, которые я пытаюсь сохранить в базе данных SQLite.   -  person Brian T Hannan    schedule 30.03.2011
comment


Ответы (1)


Однако во время тестирования я обнаружил, что не могу вставить или обновить базу данных при запуске моего приложения из файла JAR.

Нет. Записи в Jars в пути к классам времени выполнения приложения не могут быть обновлены. Банки обычно закрыты.

В результате в Jar можно развернуть БД только для чтения. Для обновления БД сначала необходимо расширить до файловой системы.

person Andrew Thompson    schedule 30.03.2011
comment
База данных находится за пределами исполняемого файла jar. Я могу читать из файла базы данных, но не могу писать в него. Похоже, что файл журнала создан (может быть, там находится ожидающая транзакция?). - person Brian T Hannan; 30.03.2011