0

在查看了在SQLite 数据库中插入数据时出现问题后,我尝试添加“c.commit();” 在我离开舞台并关闭连接之前 c. 但是,由于某种原因,它一直让我很忙。不知道动态添加的按钮“addClass”是否会导致 on action 事件处理程序出现问题。

控制器文件:

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;
import userGroups.Student;

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

public class ClassesController{
private Student user;
@FXML
private GridPane grid;
private int currentId;
private Connection c;
public void initialize(){
    Statement stmt;
    try{
        c = DriverManager.getConnection("jdbc:sqlite:users.db");
        //c.setAutoCommit(false);
        stmt = c.createStatement();

        int currentCol = 0;
        int currentRow = 1;
        currentId = 1;
        ResultSet rs = stmt.executeQuery("SELECT * FROM Classes;");
        //assuming all columns are NOT NULL
        while(rs.next()){
            Label label1 = new Label();
            label1.setText(rs.getString("CLASSNAME"));
            label1.setAccessibleText(rs.getString("CLASSNAME"));
            grid.add(label1, currentCol++, currentRow);

            Label label2 = new Label();
            label2.setText(rs.getString("SIZE"));
            grid.add(label2, currentCol++, currentRow);

            Label label3 = new Label();
            label3.setText(rs.getString("SPOTSTAKEN"));
            grid.add(label3, currentCol++, currentRow);

            Label label4 = new Label();
            label4.setText(rs.getString("INSTRUCTOR"));
            grid.add(label4, currentCol++, currentRow);

            Label label5 = new Label();
            label5.setText(rs.getString("CRN"));
            label5.setTextAlignment(TextAlignment.CENTER);
            grid.add(label5, currentCol++, currentRow);

            Label label6 = new Label();
            label6.setText(rs.getString("DAYS"));
            grid.add(label6, currentCol++, currentRow);

            Label label7 = new Label();
            label7.setText(militaryToRegularTime(rs.getString("STARTTIME")) + "-"
                    + militaryToRegularTime(rs.getString("ENDTIME")));
            grid.add(label7, currentCol++, currentRow);

            Label label8 = new Label();
            label8.setText(rs.getString("AREA"));
            grid.add(label8, currentCol++, currentRow);

            Button addClass = new Button();
            addClass.setMaxWidth(Double.MAX_VALUE);
            addClass.setText("Add Class");
            grid.add(addClass, currentCol, currentRow);
            addClass.setOnAction(new EventHandler<ActionEvent>() {
                @Override public void handle(ActionEvent e){
                    Object[] a = addClass.getProperties().values().toArray();//array of row and col values of addClass
                    int classIndex = Integer.parseInt(a[1].toString());//index of class corresponding to the button
                    String className = grid.getChildren().get(classIndex * 9).getAccessibleText();

                    if(studentHasClass(classIndex))//finds if student has the class at specific row of button
                        User.showAlert("You have already added this class!");
                    else
                        addClassToUser(classIndex, className);

                    addClass.setDisable(true);
                }
            });
            currentCol = 0;
            currentRow++;
            currentId++;
        }
        rs.close();
        stmt.close();
    } catch ( Exception e ){
        e.printStackTrace();
        User.showAlert("Please contact the admin.");
        System.exit(0);
    }
}
//adds class at classIndex to student user in database in table CLASSES_HAVE_STUDENTS
private void addClassToUser(int classIndex, String className){
    try{
        PreparedStatement statement = c.prepareStatement(
                "INSERT INTO CLASSES_HAVE_STUDENTS (CLASS_ID, CLASS_NAME, STUDENT_ID, S_USERNAME) VALUES(?,?,?,?)");
        statement.setInt(1, classIndex);
        statement.setString(2, className);
        statement.setInt(3, user.getId());
        statement.setString(4, user.getUserName());
        statement.executeUpdate();
        c.commit();
        statement.close();
    } catch ( Exception e ){
        e.printStackTrace();
        User.showAlert("Please contact the admin.");
        System.exit(0);
    }
}
//Return a boolean where if student user has a class at id
private boolean studentHasClass(int classIndex){
    Statement stmt;
    try{
        stmt = c.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT S_USERNAME FROM CLASSES_HAVE_STUDENTS WHERE CLASS_ID= " + classIndex + ";");

        while(rs.next()){
            if(rs.getString("S_USERNAME").equals(user.getUserName())){
                rs.close();
                stmt.close();
                return true;
            }
        }
        rs.close();
        stmt.close();
    } catch ( Exception e ){
        e.printStackTrace();
        User.showAlert("Please contact an admin.");
        System.exit(0);
    }
    return false;
}
//assumes militaryTime is in '00:00:00' format. returns regular time in '00:00' format
private String militaryToRegularTime(String militaryTime)
{
    Integer hour = Integer.parseInt(militaryTime.substring(0, 2));

    if(hour > 12){
        hour = hour - 12;
        return "0" + hour.toString() + militaryTime.substring(2, 5) + " pm";
    }
    return militaryTime.substring(0, 5) + " am";
}
//Changes stage to the previous stage
public void pressBack(ActionEvent event) throws IOException{
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("studentOptions.fxml"));
    loader.load();

    StudentOptionsController display = loader.getController();
    display.setUser(user);
    try{
        //c.commit();
        c.close();
    } catch (Exception e){
        e.printStackTrace();
        User.showAlert("Please contact the admin.");
        System.exit(0);
    }

    Parent userOption = loader.getRoot();
    Scene classesToAddScene = new Scene(userOption);
    Stage app_stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
    app_stage.setScene(classesToAddScene);
    app_stage.show();
}

public void setUser(Student user){
    this.user = user;
}

}

堆栈跟踪:

org.sqlite.SQLiteException: [SQLITE_BUSY]  The database file is locked (database is locked)
at org.sqlite.core.DB.newSQLException(DB.java:909)
at org.sqlite.core.DB.newSQLException(DB.java:921)
at org.sqlite.core.DB.execute(DB.java:822)
at org.sqlite.core.DB.executeUpdate(DB.java:863)
at org.sqlite.jdbc3.JDBC3PreparedStatement.executeUpdate(JDBC3PreparedStatement.java:99)
at login.ClassesController.addClassToUser(ClassesController.java:123)
at login.ClassesController.access$200(ClassesController.java:21)
at login.ClassesController$1.handle(ClassesController.java:94)
at login.ClassesController$1.handle(ClassesController.java:80)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8863)
at javafx.controls/javafx.scene.control.Button.fire(Button.java:200)
at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:206)
at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3876)
at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1300(Scene.java:3604)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1874)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2613)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
at java.base/java.lang.Thread.run(Thread.java:844)
4

0 回答 0