Tableview更新数据库在编辑

所以我想要发生的事情是让tableview在编辑后更新数据库中的数据.我想在这里使用SetonEditCommit方法.单元格编辑确实有效,但它永远不会更新,也没有错误.首先,如果这种方法实际上是有效的(可能不是),我有点无能为力,因为很难找到这个特定事物的一些来源.我发现的消息来源并不是很有帮助.所以,如果有人知道为什么它不更新,或者可能在这里提供替代选项,那将是很好的.

提到的部分:

columnType.setonEditCommit(new EventHandler<TableColumn.CellEditEvent<UserDetails,String>>() {
            @Override
            public void handle(TableColumn.CellEditEvent<UserDetails,String> event) {
              updataData();
            }
        });

        tableview.setItems(null);
        tableview.setItems(data);

    }


    public void updataData() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection("jdbc:MysqL://37.128.148.113:3306/FYS","FYS","Kcj8g87~");
            Statement con = connection.createStatement();
            //connection
            TablePosition pos = tableview.getSelectionModel().getSelectedCells().get(0);
            int row = pos.getRow();
            TableColumn col = pos.getTableColumn();
             String data1 = (String) col.getCellObservableValue(row).getValue();
            //cell
            UserDetails row1 = tableview.getSelectionModel().getSelectedItem();
            c1 = row1.getId();
            //row
            //tableview variables
            con.execute("UPDATE gevonden_bagage SET  type = 'data1' WHERE koffer_id = 'c1' ");
            //Query       
        } catch (sqlException ex) {
            System.err.println("Error" + ex);
        }
    }
//get connection,get celldata,get id data from first row,update cell with selected id

完全控制器类:

package simple;

import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.sqlException;
import java.sql.Statement;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;

import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;

/**
 *
 * @author admin
 */
public class FXMLUserController extends SimpleController implements Initializable {

    @FXML
    public TableView<UserDetails> tableview;
    @FXML
    public TableColumn<UserDetails,String> columnId;
    @FXML
    public TableColumn<UserDetails,String> columnType;
    @FXML
    public TableColumn<UserDetails,String> columnKleur;
    @FXML
    public TableColumn<UserDetails,String> columnLuchthaven;
    @FXML
    public TableColumn<UserDetails,String> columnKenmerken;
    @FXML
    public TableColumn<UserDetails,String> columnStatus;
    @FXML
    public TableColumn<UserDetails,String> columnDatum;
    @FXML
    private Button btnLoad;
    //declare observable list for database data
    private ObservableList<UserDetails> data;
    private DbConnection dc;
    String c1;

    @FXML

//strings for getRow method
    @Override
    public void initialize(URL url,ResourceBundle rb) {
        dc = new DbConnection();
        loadDataFromDatabase();
    }

    @FXML
    public void loadDataFromDatabase() {
        try {
            Connection conn = dc.Connect();
            data = FXCollections.observableArrayList();
            // Execute query and store result in a resultset
            ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM gevonden_bagage");
            while (rs.next()) {
                //get strings
                data.add(new UserDetails(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7)));
            }

        } catch (sqlException ex) {
            System.err.println("Error" + ex);
        }

        //Set cell values to tableview.
        tableview.setEditable(true);
        tableview.getSelectionModel().setCellSelectionEnabled(true);

        columnType.setCellFactory(TextFieldTableCell.forTableColumn());
        columnKleur.setCellFactory(TextFieldTableCell.forTableColumn());
        columnLuchthaven.setCellFactory(TextFieldTableCell.forTableColumn());
        columnKenmerken.setCellFactory(TextFieldTableCell.forTableColumn());
        columnStatus.setCellFactory(TextFieldTableCell.forTableColumn());
        columnDatum.setCellFactory(TextFieldTableCell.forTableColumn());
//makes columns editable
        columnId.setCellValueFactory(new PropertyValueFactory<>("id"));
        columnType.setCellValueFactory(new PropertyValueFactory<>("type"));
        columnKleur.setCellValueFactory(new PropertyValueFactory<>("kleur"));
        columnLuchthaven.setCellValueFactory(new PropertyValueFactory<>("luchthaven"));
        columnKenmerken.setCellValueFactory(new PropertyValueFactory<>("kenmerken"));
        columnStatus.setCellValueFactory(new PropertyValueFactory<>("status"));
        columnDatum.setCellValueFactory(new PropertyValueFactory<>("datum"));

    columnType.setonEditCommit(new EventHandler<TableColumn.CellEditEvent<UserDetails,update cell with selected id
    @FXML
    public void getRow() {

        TablePosition pos = tableview.getSelectionModel().getSelectedCells().get(0);
        int row = pos.getRow();
        TableColumn col = pos.getTableColumn();
// this gives the value in the selected cell:
        String data1 = (String) col.getCellObservableValue(row).getValue();
        System.out.println(data1);
//CURRENTLY UNUSED METHOD
    }

}

型号类:

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

/**
 *
 * @author admin
 */
public class UserDetails {

    private final StringProperty id;
    private final StringProperty type;
    private final StringProperty kleur;
    private final StringProperty luchthaven;
    private final StringProperty kenmerken;
    private final StringProperty status;
    private final StringProperty datum;

    //Default constructor
    public UserDetails(String id,String type,String kleur,String luchthaven,String kenmerken,String status,String datum) {
        this.id = new SimpleStringProperty(id);
        this.type = new SimpleStringProperty(type);
        this.kleur = new SimpleStringProperty(kleur);
        this.luchthaven = new SimpleStringProperty(luchthaven);
        this.kenmerken = new SimpleStringProperty(kenmerken);
        this.status = new SimpleStringProperty(status);
        this.datum = new SimpleStringProperty(datum);

    }

    //getters
    public String getId() {
        return id.get();
    }

    public String getType() {
        return type.get();
    }

    public String getKleur() {
        return kleur.get();
    }

    public String getLuchthaven() {
        return luchthaven.get();
    }

    public String getKenmerken() {
        return kenmerken.get();
    }

    public String getStatus() {
        return status.get();
    }

    public String getDatum() {
        return datum.get();
    }

    //setters
    public void setId(String value) {
        id.set(value);
    }

    public void setType(String value) {
        type.set(value);
    }

    public void setKleur(String value) {
        kleur.set(value);
    }

    public void setLuchthaven(String value) {
        luchthaven.set(value);
    }

    public void setKenmerken(String value) {
        kenmerken.set(value);
    }

    public void setStatus(String value) {
        status.set(value);
    }

    public void setDatum(String value) {
        datum.set(value);
    }

    //property values
    public StringProperty idproperty() {
        return id;
    }

    public StringProperty typeproperty() {
        return type;
    }

    public StringProperty kleurproperty() {
        return kleur;
    }

    public StringProperty luchthavenproperty() {
        return luchthaven;
    }

    public StringProperty kenmerkenproperty() {
        return kenmerken;
    }

    public StringProperty statusproperty() {
        return status;
    }

    public StringProperty datumproperty() {
        return datum;
    }
}

解决方法

TableView documentation

By default the TableColumn edit commit handler is non-null,with a
default handler that attempts to overwrite the property value for the
item in the currently-being-edited row. It is able to do this as the
Cell.commitEdit(Object) method is passed in the new value,and this is
passed along to the edit commit handler via the CellEditEvent that is
fired. It is simply a matter of calling
TableColumn.CellEditEvent.getNewValue() to retrieve this value.

It is very important to note that if you call
TableColumn.setonEditCommit(javafx.event.EventHandler) with your own
EventHandler,then you will be removing the default handler. Unless
you then handle the writeback to the property (or the relevant data
source),nothing will happen.

所以问题是通过在columnType上设置onEditCommit,可以删除实际更新UserDetails实例中的typeProperty的认处理程序.所以

String data1 = (String) col.getCellObservableValue(row).getValue();

给出旧值,对数据库的更新不会改变任何内容.

此外,您在创建sql语句的方式中存在错误.您在WHERE子句中使用文字值’c1′(而不是变量c1中包含的值,而类似地将type的值设置为文字值’data1′,而不是变量data1中的值.

这是一个修复,以及代码的一些简化和一些避免SQL injection attacks的更好的实践:

columnType.setonEditCommit(event -> {
    UserDetails user = event.getRowValue();
    user.setType(event.getNewValue());
    updateData("type",event.getNewValue(),user.getId());
});

接着

private void updateData(String column,String newValue,String id) {

    // btw it is way better to keep the connection open while the app is running,// and just close it when the app shuts down....

    // the following "try with resources" at least makes sure things are closed:

    try (
        Connection connection = DriverManager.getConnection("jdbc:MysqL://37.128.148.113:3306/FYS","Kcj8g87~");
        PreparedStatement stmt = connection.prepareStatement("UPDATE gevonden_bagage SET "+column+" = ? WHERE koffer_id = ? ");
    ) {

        stmt.setString(1,newValue);
        stmt.setString(2,id);
        stmt.execute();
    } catch (sqlException ex) {
        System.err.println("Error");
        // if anything goes wrong,you will need the stack trace:
        ex.printstacktrace(System.err);
    }
}

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...