Javafx 数据库连接,加载数据循环错误
我目前有两个不同的fxml页面。一个是主屏幕,另一个处理连接。主屏幕当前正在创建初始化时所需的数据库和表。另一个页面用于添加和删除数据库中的值。问题是,我当前正在主页上运行一个函数,用initialize中的数据库数据填充ChoiceBox,但当它运行时,它会尝试再次创建表,并抛出一个错误,因为表已经创建。有没有简单的方法来解决这个问题 以下是主页面初始化功能:Javafx 数据库连接,加载数据循环错误,javafx,combobox,derby,Javafx,Combobox,Derby,我目前有两个不同的fxml页面。一个是主屏幕,另一个处理连接。主屏幕当前正在创建初始化时所需的数据库和表。另一个页面用于添加和删除数据库中的值。问题是,我当前正在主页上运行一个函数,用initialize中的数据库数据填充ChoiceBox,但当它运行时,它会尝试再次创建表,并抛出一个错误,因为表已经创建。有没有简单的方法来解决这个问题 以下是主页面初始化功能: public void initialize() { try { Class.forName
public void initialize() {
try {
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
//below gets the connection specified earlier
conn = DriverManager.getConnection(dbURL);
System.out.println("DB Connection Created!");
String createString = "CREATE TABLE Connections (DETAILS VARCHAR(255) NOT NULL, NAME VARCHAR(255) UNIQUE)";
stmt = conn.createStatement();
stmt.execute(createString);
System.out.println("Connections table created!");
//below is for populating the usernames
String sql2 = "Select NICKNAME FROM Users ORDER BY NICKNAME ASC";
stmt = conn.createStatement();
ResultSet rs2 = stmt.executeQuery(sql2);
usernameList.clear();
while(rs2.next()) {
String name = rs2.getString("NICKNAME");
usernameList.add(name);
System.out.println("User initialize: " + name);
}
System.out.println("Objects: " + usernameList);
sourceUsername.setItems(FXCollections.observableArrayList(usernameList));
cbosUsername.setItems(FXCollections.observableArrayList(usernameList));
tiUsername.setItems(FXCollections.observableArrayList(usernameList));
}
catch(Exception e) {
e.printStackTrace();
}
}
有人对解决这个问题的简单方法有什么意见吗?我认为最好的方法是将CREATE语句放在应用程序启动方法中:
public class MyApp extends Application {
public void start(Stage stage) {
//perform create statement
}
}
或者只捕获CREATE语句中的所有异常:
try{
String createString = "CREATE TABLE Connections (DETAILS VARCHAR(255) NOT NULL, NAME VARCHAR(255) UNIQUE)";
stmt = conn.createStatement();
stmt.execute(createString);
} catch (Exception e){
}
所以您多次执行
initialize()
?为什么不将create语句移到其他地方,这样就不会执行两次?问题是我需要先填充数据,如果没有创建表,然后尝试从中选择数据并抛出一个错误,我的意思是,您可以将代码移动到一个节,该节在启动时只执行一次,因此,在进一步的代码中,您可以假设表是被创建的。真正的问题是为什么initialize()
会被多次调用。这不应该发生。你能发布更多的代码吗:阅读(并发布)堆栈跟踪以查看相关内容。你不能只加载一次吗?保留对根节点和控制器的引用,只是重新显示同一节点,而不是重新加载它。考虑过这样做,但它是一个嵌入式derby数据库,不支持“IF not EXISTS”SQL create语句如何执行SELECT*FROM Connections
并捕获异常?如果得到正确的异常,可以调用CREATE语句不要挤压异常。如果出现其他问题(如意外),您将无法知道或诊断。将数据库创建移到start(…)
方法可能是这里的方法。这就是为什么我对捕获异常犹豫不决的原因。无法保证这也是导致这些异常的原因。@dgelinas21您不需要接受所有异常,您可以尝试捕获将在重复创建时抛出的异常。您仍然可以按常规方式处理其他异常。我只是不知道这里会抛出什么,所以我把所有的异常都作为一个例子。