Това е отворен въпрос.
За мен имате няколко опции...
Бихте могли...
Актуализирайте базата данни в реално време, когато данните се променят в таблицата.
Това ще изисква или да разширите 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
които са се променили. След това просто ще прегледате този списък и ще извикате съответния израз за актуализиране на базата данни.