我正在开发一个项目,其中我有一个SQLite数据库,其中包含一个名为Table1的表,并且没有ID作为列等的标题/位置值...
我的表单有一个组合框,我设法让它在一行中显示我的数据库每个条目。现在我想用一个“删除”按钮删除我在组合框中选择的行,我有点迷失。
这是我的组合框代码(我觉得很好):
private void FillCombo(){
try {
String newLine = System.getProperty("line.separator");
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:C:\\users\\Kajou\\momentsdb.sqlite");
statement = connection.createStatement();
resultSet = statement.executeQuery("SELECT * FROM Table1");
while (resultSet.next()) {
comboBox1.addItem(resultSet.getString("Title") + " " + "Date:" + resultSet.getString("Day")+"/"+ resultSet.getString("Month") +"/" + resultSet.getString("Year") + " " + resultSet.getString("Location")+ " " + resultSet.getString("Mood"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
resultSet.close();
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
现在关于按钮删除。我尝试了一些东西,但看起来不顺利:
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:C:\\users\\Kajou\\momentsdb.sqlite");
statement = connection.createStatement();
String sql = "DELETE FROM Table1 WHERE col_string=Title";
int deleteCount = statement.executeUpdate(sql);
sql = "DELETE FROM Table1 WHERE col_string=?";
pst = connection.prepareStatement(sql);
pst.setString(1,"a string");
deleteCount=pst.executeUpdate();
} catch (ClassNotFoundException ex) {
Logger.getLogger(DeleteImportantMomentsForm.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(DeleteImportantMomentsForm.class.getName()).log(Level.SEVERE, null, ex);
}
}
答案 0 :(得分:0)
您需要以下内容:
Object item = comboBox.getSeletedItem();
pst.setString(1, item.toString());
答案 1 :(得分:0)
首先,对不起延期,但我有几个建议:)
1)我的表单有一个组合框,我设法让它每个显示我的数据库 一行进入
以下是您在组合框中添加条目的方式:
comboBox1.addItem(resultSet.getString("Title") + " " + "Date:" +
resultSet.getString("Day")+"/"+
resultSet.getString("Month") +"/" +
resultSet.getString("Year") + " " +
resultSet.getString("Location")+ " " +
resultSet.getString("Mood"));
通过这种方式,您将在组合框中添加一个非常大的字符串,这不是错误,但如果将此信息映射到域类,则可以大大改进。例如:
class MyClass {
int day, month, year;
String title, location, mood;
public MyClass(int day, int month, int year,
String title, String location, String mood) {
this.day = day;
this.month = month;
this.year = year,
this.title = title;
this.location = location;
this.mood = mood;
}
// getters and setters are up to you :)
}
下一步是在组合框中添加新的MyClass
对象:
while (resultSet.next()) {
MyClass myClass = new MyClass(resultSet.getInt("Day"),
resultSet.getInt("Month"),
resultSet.getInt("Year"),
resultSet.getString("Title"),
resultSet.getString("Location"),
resultSet.getString("Mood"));
comboBox1.addItem(myClass); // see note below
}
注意:必须在Event Dispatching Thread(a.k.a。EDT)中创建和更新Swing组件(例如JComboBox
),这是一个单独的特殊线程。如果您在EDT中运行繁重的任务(例如数据库连接),那么此任务可能会阻止EDT,您的GUI将冻结,Swing组件将无法工作(甚至显示),直到此任务完成。为避免此问题,您可以使用一些工具在单独的线程中执行繁重的任务,并更新EDT中的Swing组件,例如SwingWorker。有关详细信息,请查看Concurrency in Swing。
所以我建议您使用SwingWorker
:
SwingWorker<Void,MyClass> worker = new SwingWorker<Void,MyClass>() {
@Override
protected Void doInBackground() throws Exception { // this take place in a background thread
// connect to the database and execute the query here
while (resultSet.next()) {
MyClass myClass = new MyClass(resultSet.getInt("Day"), ...);
publish(myClass);
}
return null;
}
@Override
protected void process(List<MyClass> chunks){ // this take place in the EDT
for(MyClass myClass : chunks){
comboBox1.addItem(myClass);
}
}
}
现在您已将项目正确添加到组合框中。下一步是使组合框显示您想要的文本。为此,您需要实施ListCellRenderer。请查看Providing a Custom Renderer教程中的How to Use Combo Boxes部分。看看这个example。这是关于将自定义渲染器设置为JList
,但完全相同适用于JComboBox
。
2)现在我想用一个“删除”按钮来删除我拥有的行 在组合框中选择,我有点迷失
请注意,您正尝试执行两个不同的删除查询:
String sql = "DELETE FROM Table1 WHERE col_string=Title"; // This doesn't make sense
int deleteCount = statement.executeUpdate(sql);
sql = "DELETE FROM Table1 WHERE col_string=?"; // This looks better I guess
pst = connection.prepareStatement(sql);
我怀疑其中一个查询(如果不是两个)都会抛出异常。
由于您的组合框将包含MyClass
个对象,您可以在执行的操作方法中进行此更改:
MyClass myClass = (MyClass)comboBox1.getSelectedItem();
String sql = "DELETE FROM Table1 WHERE Title = ?"; //If Title is the name of the column, of course
PreparedStatement pst = connection.prepareStatement(sql);
pst.setString(1,myClass.getTitle());
注意:再一次,执行动作的方法在EDT中执行。您应该将数据库调用移动到后台线程以避免阻止EDT。