Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да актуализирате променените данни в базата данни с помощта на JTable?

Това е отворен въпрос.

За мен имате няколко опции...

Бихте могли...

Актуализирайте базата данни в реално време, когато данните се променят в таблицата.

Това ще изисква или да разширите TableModel така че имате достъп до setValue метод, който ще ви позволи не само да актуализирате състоянието на модела, но и да актуализирате състоянието на базата данни (аз бих актуализирал базата данни и когато е успешен, актуализирам модела, но това съм аз) ИЛИ да прикачите слушател към модела и следете за подходящо TableChanged събития и съответно актуализирайте базата данни.

Макар че това изглежда като приятен метод, рискувате да „окачите“ потребителския интерфейс, докато базата данни е актуализирана или да излезете от синхрон с това, което е в модела и какво е в базата данни...

Бихте могли...

Създайте Class който представлява данните от базата данни. Когато стойността е променена в този обект, вие просто ще повдигнете флаг, посочващ, че редът е променен.

Когато потребителят приключи с промените в данните в таблицата, ще щракне върху „запазване“. След това ще преминете през всички обекти и ще определите кои от тях трябва да бъдат актуализирани и ще ги „запишете“ обратно в базата данни.

Това има потенциал да позволи да се записват обратно в базата данни "застояли" данни (т.е. потребител А зарежда данните и започва да прави промени. Потребител Б междувременно зарежда данните, прави промени и ги записва обратно в базата данни. След това потребител А запазва промените си, като презаписва някои от промените, които потребител Б вече е извършил)

Има подходи за решаване и на двата, но трябва да решите кой подход най-добре отговаря на текущия ви проблем, актуализации в реално време или забавени...

Актуализирано с основен пример

Първото нещо, което трябва да направите, е да започнете със създаване на клас, който представлява данните от вашата база данни. Обикновено бих започнал с Interface и използвайте някаква фабрика за генериране на действителната реализация, но малки стъпки...

Това има една много важна променлива, hasChanged . Това се използва за маркиране на обекта, който трябва да бъде актуализиран...

public class Person {

    private boolean hasChanged = false;

    private String firstName;
    private String lastName;

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public boolean hasChanged() {
        return hasChanged;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setFirstName(String value) {
        if (value == null ? firstName != null : !value.equals(firstName)) {
            firstName = value;
            hasChanged = true;
        }
    }

    public void setLastName(String value) {
        if (value == null ? lastName != null : !value.equals(lastName)) {
            lastName = value;
            hasChanged = true;
        }
    }
}

След това изградихме модел на таблица, способен да моделира списък с обекти...

public class PeopleTableModel extends AbstractTableModel {

    private List<Person> people;

    public PeopleTableModel() {
        people = new ArrayList<>(20);
    }

    public void addPerson(Person person) {
        people.add(person);
        fireTableRowsInserted(people.size() - 1, people.size() - 1);
    }

    public Person getPersonAt(int row) {
        return people.get(row);
    }

    public List<Person> getChangedPeople() {
        List<Person> changed = new ArrayList<>(people.size());

        for (Person p : people) {
            if (p.hasChanged()) {
                changed.add(p);
            }
        }

        return changed;    
    }

    @Override
    public int getRowCount() {
        return people.size();
    }

    @Override
    public String getColumnName(int column) {
        String name = null;
        switch (column) {
            case 0:
                name = "First name";
                break;
            case 1:
                name = "First name";
                break;
        }
        return name;
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Person p = people.get(rowIndex);
        Object value = null;
        switch (columnIndex) {
            case 0:
                value = p.getFirstName();
                break;
            case 1:
                value = p.getLastName();
                break;
        }
        return value;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        if (aValue instanceof String) {
            Person p = people.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    p.setFirstName(aValue.toString());
                    break;
                case 1:
                    p.setLastName(aValue.toString());
                    break;
            }
            fireTableRowsUpdated(rowIndex, rowIndex);
        }
    }
}

Има много начини за постигане на едно и също нещо, но основно тук съм предоставил метод, наречен getChangedPeople който ще върне всички People които са се променили. След това просто ще прегледате този списък и ще извикате съответния израз за актуализиране на базата данни.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP как да проверя за имейл, който вече е в базата данни на MySQL?

  2. MySQL Съхранена процедура с параметри

  3. Свържете се с отдалечена база данни MySQL с помощта на VB.NET 2010

  4. mysql получава разлика вместо SUM

  5. Грешки при инсталиране на mysql2 gem чрез Bundler