【问题标题】:Select item from JCombobox and delete the row in database从 JCombobox 中选择项目并删除数据库中的行
【发布时间】:2013-12-20 02:42:39
【问题描述】:

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

【问题讨论】:

  • 感谢您的提问,欢迎来到 StackOverflow。好吧,您的控制台上可能有一些异常或堆栈跟踪。他们会澄清情况,或者至少比“这有点行不通”更精确的问题会很好。如果没有更多信息,很难说缺少什么。
  • 它无法跟踪我给出的字符串,这就是我得到的错误。我不知道如何从组合框中删除选定的项目,这是主要问题,我希望能得到一些帮助或类似的例子。我在谷歌或这里的搜索中找不到类似的东西

标签: java swing sqlite jcombobox sql-delete


【解决方案1】:

你需要这样的东西:

Object item = comboBox.getSeletedItem();
pst.setString(1, item.toString());

【讨论】:

  • 感谢您的回答,但由于我是新手,您能告诉我将这些命令放在哪里吗?或者如果您可以编辑它,我将不胜感激
  • @user3046729,认真的吗?我添加了一行代码并更改了另一行。你认为代码去哪儿了?
【解决方案2】:

首先,很抱歉延期,但我有几个建议给你:)

1) 我的表单有一个组合框,我设法让它显示我的 DB 一行输入

这是您向组合框添加条目的方式:

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
}

注意: Swing 组件(例如JComboBox)必须在Event Dispatching Thread(又名EDT)中创建和更新,这是一个单一且特殊的线程。如果您在 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。查看How to Use Combo Boxes 教程中的Providing a Custom Renderer 部分。看看这个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());

注意: 再一次,action executed 方法在 EDT 中执行。您应该将数据库调用移至后台线程以避免阻塞 EDT。

【讨论】:

  • 哇,非常感谢您的回答和帮助!在最后一个 [代码] 标题只是我的列中的一个,我在同一行中还有 5 个,所以如果我想删除整行,我也只需添加其他列?再次感谢工作时间:)
  • @user3046729 不客气! :) 标题只是我的列之一,我在同一行还有 5 个列,所以如果我想删除整行,我也只需添加其他列? 不一定。 DELETE 语句将删除与 WHERE 子句中定义的所有条件匹配的整行。在示例中,如果您有两条标题完全相同的记录(元组),则两者都将被删除。所以要小心并确保你的 WHERE 子句定义正确;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多