JavaFX Sqlite从选定的ListView元素中获取ID

时间:2016-03-27 14:16:24

标签: sqlite listview javafx

我有一个ListView,其中填充了艺术品名称(来自SQLite数据库),这些是字符串,名称不是主键(不是唯一的)。当然每件艺术品都有自己的ID(主键)。

我做了什么,我从这个列表中选择一个艺术作品并将其作为字符串参数传递给一个按钮,这会创建其他信息(这个问题不是必需的)。

但是我选择了名称,现在我需要从这个选定的艺术作品中获取ID作为外键。

当然我可以像这样创建一个选择查询:

"select * from Artwork where Name = ?";

然后从具有此名称的艺术作品中获取ID,但正如我之前所说,可能会有多个具有相同名称的作品,所以这不是很好。

我有的Plan B是在ListView中显示艺术品的ID,然后如果你选择一件艺术品,你可以在" "切片,并使用包含的list参数身份证。

但这感觉不对。

谢谢!我希望你理解我需要什么,如果不是我可以提供代码,但确实有很多。

1 个答案:

答案 0 :(得分:3)

您在列表视图(数据)中显示显示的内容与 的显示方式(视图)相混淆。您希望数据由包含id和名称的对象组成。您希望视图只显示这些对象的名称。

创建一个表示包含id和名称的Artwork的类:

public class Artwork {

    private final int id ;
    private final String name ;

    public Artwork(int id, String name) {
        this.id = id ;
        this.name = name ;
    }

    public String getName() {
        return name ;
    }

    public int getId() {
        return id ;
    }
}

让您的数据库代码返回Artwork个对象的列表,并定义列表视图:

ListView<Artwork> listView = new ListView<>();
listView.getItems().addAll(getArtworkFromDatabase());

最后,要配置列表视图的显示方式,请设置单元格工厂:

listView.setCellFactory(lv -> new ListCell<Artwork>() {
    @Override
    public void updateItem(Artwork artwork, boolean empty) {
        super.updateItem(artwork, empty) ;
        setText(empty ? null : artwork.getName());
    }
}

现在,您可以从所选项目中获取所需的任何数据:

Artwork selected = listView.getSelectionModel().getSelectedItem();
int selectedId = selected.getId();
String selectedName = selected.getName();