これは自由回答形式の質問です。
私には、いくつかのオプションがあります...
あなたは出来る...
テーブル内のデータが変更されると、リアルタイムでデータベースを更新します。
TableModel
これには、メソッドにアクセスできるように拡張する必要があります。これsetValue
により、モデルの状態を更新するだけでなく、データベースの状態も更新できます (データベースを更新し、成功したら更新します)。モデル、しかしそれは私です) またはモデルにリスナーをアタッチし、適切なTableChanged
イベントを監視し、それに応じてデータベースを更新します。
これは良い方法のように見えますが、データベースの更新中に UI が「ハング」したり、モデルの内容やデータベースの内容と同期しなくなったりするリスクがあります...
あなたは出来る...
Class
データベースからのデータを表す を作成します。このオブジェクト内で値が変更された場合、行が変更されたことを示すフラグを立てるだけです。
ユーザーがテーブル データの変更を終了したら、[保存] をクリックします。次に、すべてのオブジェクトを調べて、更新する必要があるオブジェクトを特定し、それらをデータベースに「保存」します。
これにより、「古い」データがデータベースに書き戻される可能性があります (つまり、ユーザー A がデータをロードして変更を開始します。その間にユーザー B がデータをロードし、変更を加えてデータベースに保存し直します)。次に、ユーザー A は変更を保存し、ユーザー B が既にコミットした変更の一部を上書きします)
両方を解決するためのアプローチがありますが、現在の問題、リアルタイムまたは遅延更新のどちらのアプローチが最も適しているかを決定する必要があります...
基本的な例で更新
最初に、データベースのデータを表すクラスを作成することから始めます。通常、私は a から始めてInterface
、実際の実装を生成するためにある種のファクトリを使用しますが、小さなステップ...
これには 1 つの非常に重要な変数があり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
た。次に、このリストをループして、適切なデータベース更新ステートメントを呼び出すだけです。