JavaFX zapis Tableview w bazie danych

0

Mam program, który pobiera dane z bazy danych SQLite i wyświetla je w TableView. Nastepnie użytkownik wybrane dane może dodać do innego TableView. Potrzebuje teraz ten utworzony przez użytkownika TableView zapisać w pliku/bazie danych, tak ty przy kolejnym starcie programu móc je wczytać. Niestety, nie mogę znaleźć żadnych pomocnych informacji jak się za to zabrać, wszędzie pisze tylko o wczytywaniu danych z bazy do TableView, ale nie odwrotnie. Niżej zamieszczam działające do tej pory metody

wczytywanie danych z bazy danych

@FXML
    private TableView<productData> tableProduct;
    private ObservableList<productData> products;

    @FXML
    private TableView<productData> tableProduct2;

  private void loadTypeDataFromDB(String type){
        products = FXCollections.observableArrayList();
              try {
            PreparedStatement pst =  conn.prepareStatement("SELECT name, kcal, protein, carb, fat FROM Products WHERE type=?");
            pst.setString(1, type);
            ResultSet rs = pst.executeQuery();
                  while(rs.next()){
                products.add(new productData(rs.getString("name"), rs.getString("kcal"), rs.getString("protein"), rs.getString("carb"), rs.getString("fat")));
            }
        } catch (SQLException e) {
            e.printStackTrace();
            System.err.println(e);
        }

        colProduct.setCellValueFactory(new PropertyValueFactory<productData, String>("name"));
        colKcal.setCellValueFactory(new PropertyValueFactory<productData, String>("kcal"));
        colProtein.setCellValueFactory(new PropertyValueFactory<productData, String>("protein"));
        colCarbs.setCellValueFactory(new PropertyValueFactory<productData, String>("carb"));
        colFat.setCellValueFactory(new PropertyValueFactory<productData, String>("fat"));

        tableProduct.setItems(null);
        tableProduct.setItems(products);
    }

metoda dodająca obiekt z jednego tableview do drugiego i przy okazji tworząca tablice w bazie i dodająca do niej ten obiekt

public void addMeal() {
        productData selection = tableProduct.getSelectionModel().getSelectedItem();
        if (selection != null) {
            tableProduct2.getItems().add(new productData(selection.getName() + "(" + Float.parseFloat(weightField.getText()) + "g)", String.valueOf(Float.parseFloat(selection.getKcal())*(Float.parseFloat(weightField.getText())/100)), String.valueOf(Float.parseFloat(selection.getProtein())*(Float.parseFloat(weightField.getText())/100)), String.valueOf(Float.parseFloat(selection.getCarb())*(Float.parseFloat(weightField.getText())/100)), String.valueOf(Float.parseFloat(selection.getFat())*(Float.parseFloat(weightField.getText())/100))));
            }
        updateSummary();

                String db = String.valueOf("uid" + userID + "date" + simpleDate.format(new Date()));
                String query1 = "CREATE TABLE if not exists " + db + " (name TEXT, kcal FLOAT, protein FLOAT, carbs FLOAT, fat FLOAT)";
                String query2 = "INSERT INTO " + db + " (name, kcal, protein, carbs, fat) VALUES (?, ?, ?, ?, ?)";
            try {
                PreparedStatement pst1 = conn.prepareStatement(query1);
                pst1.executeUpdate();
                PreparedStatement pst = conn.prepareStatement(query2);
                pst.setString(1, selection.getName() + "(" + Integer.parseInt(weightField.getText()) + "g)");
                pst.setString(2, String.valueOf(Float.parseFloat(selection.getKcal())*(Float.parseFloat(weightField.getText())/100)));
                pst.setString(3, String.valueOf(Float.parseFloat(selection.getProtein())*(Float.parseFloat(weightField.getText())/100)));
                pst.setString(4, String.valueOf(Float.parseFloat(selection.getCarb())*(Float.parseFloat(weightField.getText())/100)));
                pst.setString(5, String.valueOf(Float.parseFloat(selection.getFat())*(Float.parseFloat(weightField.getText())/100)));
                pst.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            System.out.println(db);
    }

Niestety problemy zaczynają się przy usuwaniu obiektów z tego TableView, mogą być np. dodane 2 obiekty o takiej samej nazwie, wtedy zostaną usunięte od razu wszystkie... Chciałbym więc po prostu etap dodania wszystkiego do bazy danych zrealizować inną metodą, która po prostu weźmie wszystkie elementy dodane przez użytkownika do TableView i zapisze je w bazie danych... mógły ktoś mnie naprowadzić jak się za to zabrać?

0

Kod, który załączyłeś to pod wieloma względami gruby WTF. Niestety, więcej jest tu do poprawienia niż jest dobrze:

  1. productData - nazwy klas zapisujemy w notacji CamelCase
  2. private ObservableList<productData> products - to pole jest niepotrzebne - ewentualnie zmienna lokalna dla wygody.
    3. colKcal.setCellValueFactory(new PropertyValueFactory<productData, String>("kcal")); Czemu kolumna jest typu String jeśli jest to wartość liczbowa?
  3. tableProduct2.getItems().add(new productData(selection.getName() + "(" + Float.parseFloat(weightField.getText())... A może by tak dodać jednak konstruktor kopiujący jeśli koniecznie chcesz to trzymać w tej samej klasie - choć uzasadnione jest tutaj stworzenie innej klasy do trzymania produktu z gramaturą
  4. String query1 = "CREATE TABLE if not exists " + db + " (name TEXT, kcal FLOAT, protein FLOAT, carbs FLOAT, fat FLOAT)"; - perełka - rozumiem, że chcesz dla każdego użytkownika na każdy dzień tworzyć kolejną tabelę w bazie? Tak się tego nie robi. Do poczytania na temat normalizacji bazy danych.
  5. pst.setString(2, String.valueOf(Float.parseFloat(selection.getKcal())*(Float.parseFloat(weightField.getText())/100))); - parsujesz Stringa do Floata i znowu do Stringa - bez sensu - w klasie productData trzymaj dane takie jakie mają być - kalorie najczęściej podaje się jako wartości całkowite, gramaturę posiłków też (w gramach) - po co więc Float?

Dodawanie całości tabeli do bazy robisz tak, że robisz przycisk z wdzięcznym napisem "zapisz do bazy". Wyciągasz sobie z tabeli wszystkie obiekty (table.getItems()) i po kolei zapisujesz. Podziel sobie to na dwa etapy. Stwórz interface ProductDAO i w nim metody np. getAll(), save(Product p ); saveAll(List<Product> p) etc. Stwórz implementację tego interface'u która będzie to zapisywała na początek do jakiegoś pliku csv. Popraw kod, który masz żeby miał ręce i nogi i działał. Wtedy napisz sobie implementację tego interface'u, która zapisuje w bazie danych np korzystając z jakiegoś ORM bo ręczne babranie się z JDBC nie ma tutaj sensu - szybciej nauczysz się podstaw Hibernate albo SpringData niż napiszesz to w JDBC.

1 użytkowników online, w tym zalogowanych: 0, gości: 1