从JCombobox中选择项目并删除数据库中的行

时间:2013-12-03 20:48:15

标签: java swing sqlite jcombobox sql-delete

我正在开发一个项目,其中我有一个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);
    }            
}

2 个答案:

答案 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。