@barmatograf3000

Почему скомпилированный .exe не может подключиться к SQLite?

Пишу проект на java c использованием javafx в intellij idea. Проблема состоит в том, что при запуске из ide программа читает/пишет в базу данных и все прекрасно, ошибок/предупреждений нет. Но скомпилированный .ехе отказывается работать.
В корне диска D находится файл DATA.db
Он открывается и редактируется через DB Browser (SQLite)
Таблица в базе данных не пустая. Но .ехе отказывается ее читать в методе updateListDatabase()
Буду благодарен за помощь/подсказку.

Мой класс:
package sample;

import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.stage.Stage;

import java.io.IOException;
import java.sql.*;

public class Controller {

    public static Stage stage1, stage2;
    public static String dbPath;
    private boolean newDatabaseStatus = createDatabase.newDatabaseStatus;

    private Statement statement;
    private Connection connection;

    @FXML
    private ListView<String> listDB;

    public void initialize() throws ClassNotFoundException, SQLException, IOException {
        try {
            Class.forName("org.sqlite.JDBC");
            connection = DriverManager.getConnection("jdbc:sqlite:D:/DATA.db");
            statement = connection.createStatement();
            statement.execute("CREATE TABLE if not exists 'databaselist' ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'name' text, 'path' text);");


            updateListDatabase();

            System.out.println("Таблица выведена");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        Thread myThread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (!Thread.currentThread().isInterrupted()) {
                    Platform.runLater(new Runnable() {
                        @Override public void run() {
                            newDatabaseStatus = createDatabase.newDatabaseStatus;
                            if(newDatabaseStatus == true){
                                createDatabase.newDatabaseStatus = false;
                                try {
                                    updateListDatabase();
                                } catch (SQLException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        return;
                    }
                }
            }
        });
        myThread.start();

    }

    @FXML
    private void addDatabaseToList(){
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("createDatabase.fxml"));
            Parent root1 = fxmlLoader.load();
            stage1 = new Stage();
            stage1.setScene(new Scene(root1, 456, 150));
            stage1.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void openDatabase() {
            System.out.println(listDB.getSelectionModel().getSelectedItem());
            String path = listDB.getSelectionModel().getSelectedItem().substring(listDB.getSelectionModel().getSelectedItem().indexOf('-') + 2);
            dbPath = "jdbc:sqlite:" + path.replace('\\', '/');
            System.out.println(dbPath);

            try {
                FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("databaseView.fxml"));
                Parent root1 = fxmlLoader.load();
                stage2 = new Stage();
                stage2.setTitle(listDB.getSelectionModel().getSelectedItem());
                stage2.setScene(new Scene(root1, 1200, 800));
                stage2.show();
            } catch (Exception e) {
                e.printStackTrace();
            }
    }

    public void updateListDatabase() throws SQLException {
        listDB.getItems().clear();
        ResultSet resultSet = statement.executeQuery("SELECT * FROM databaselist");

        while(resultSet.next())
        {
            int id = resultSet.getInt("id");
            String  name = resultSet.getString("name");
            String  path = resultSet.getString("path");

            listDB.getItems().add(name + " - " + path.replace("jdbc:sqlite:", "").replace("/", "\\"));
        }
    }
}

Разметка:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <ListView fx:id="listDB" layoutX="14.0" layoutY="14.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0" />
      <Button layoutX="14.0" layoutY="230.0" mnemonicParsing="false" onAction="#addDatabaseToList" prefHeight="20.0" prefWidth="150.0" text="Новая база данных" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="220.0" />
      <Button onAction="#openDatabase" layoutX="10.0" layoutY="259.0" mnemonicParsing="false" prefHeight="20.0" prefWidth="150.0" text="Открыть" AnchorPane.topAnchor="260.0" />
      <Button layoutX="10.0" layoutY="301.0" mnemonicParsing="false" prefHeight="20.0" prefWidth="150.0" text="SQL" AnchorPane.topAnchor="300.0" />
      <Button layoutX="10.0" layoutY="339.0" mnemonicParsing="false" prefHeight="20.0" prefWidth="150.0" text="Формы" AnchorPane.topAnchor="340.0" />
   </children>
</AnchorPane>
  • Вопрос задан
  • 324 просмотра
Пригласить эксперта
Ответы на вопрос 2
tsklab
@tsklab
Здесь отвечаю на вопросы.
"jdbc:sqlite:D:/DATA.db"
"jdbc:sqlite:D:\DATA.db"
Ответ написан
Комментировать
@rPman
Проверьте запускаете ли вы приложение с сетевого или webdaw диска или с локального (локальным диском так же считается подключенный vhd с сетевого размещения), особенно если вы используете javafxpackager или аналоги, заворачивающие java виртуальную машину в exe приложение. Запуск с помощью java - jar считается локальным (а отладчик так и делает), так как exe-приложением является виртуальная машина java а она у вас скорее всего установлена локально.

При запуске приложений по сети действуют отдельные настройки политики и доступа к файлам, в т.ч. по сети, особенно я встречал много проблем при использовании .net скомпилированных приложений (не ваш случай но проблемы похожие).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы