Đây là một câu hỏi kết thúc mở.
Đối với tôi, bạn có một vài lựa chọn ...
Bạn có thể ...
Cập nhật cơ sở dữ liệu theo thời gian thực khi dữ liệu được thay đổi trong bảng.
Điều này sẽ yêu cầu bạn mở rộng TableModel
vì vậy bạn có quyền truy cập vào setValue
phương thức này cho phép bạn không chỉ cập nhật trạng thái của mô hình mà còn cập nhật trạng thái của cơ sở dữ liệu (tôi sẽ cập nhật cơ sở dữ liệu và khi thành công, hãy cập nhật mô hình, nhưng đó là tôi) HOẶC đính kèm một trình nghe vào mô hình và giám sát TableChanged
phê duyệt sự kiện và cập nhật cơ sở dữ liệu cho phù hợp.
Mặc dù đây có vẻ là một phương pháp hay, nhưng bạn có nguy cơ "treo" giao diện người dùng trong khi cơ sở dữ liệu được cập nhật hoặc không đồng bộ với những gì trong mô hình và những gì trong cơ sở dữ liệu ...
Bạn có thể ...
Tạo một Class
đại diện cho dữ liệu từ cơ sở dữ liệu. Khi một giá trị được thay đổi trong đối tượng này, bạn chỉ cần giơ cờ cho biết rằng hàng đã thay đổi.
Khi người dùng thực hiện xong các thay đổi đối với dữ liệu bảng, họ sẽ nhấp vào "lưu". Sau đó, bạn sẽ xem qua tất cả các đối tượng và xác định đối tượng nào cần được cập nhật và "lưu" chúng trở lại cơ sở dữ liệu.
Điều này có khả năng cho phép dữ liệu "cũ" được ghi trở lại cơ sở dữ liệu (tức là Người dùng A tải dữ liệu và bắt đầu thực hiện thay đổi. Người dùng B trong thời gian chờ đợi sẽ tải dữ liệu, thực hiện thay đổi và lưu dữ liệu trở lại cơ sở dữ liệu. Sau đó, Người dùng A lưu các thay đổi của họ, ghi đè một số thay đổi Người dùng B đã cam kết)
Có những cách tiếp cận để giải quyết cả hai, nhưng bạn cần phải quyết định cách tiếp cận nào phù hợp nhất với vấn đề hiện tại của bạn, cập nhật theo thời gian thực hoặc bị trì hoãn ...
Đã cập nhật với ví dụ cơ bản
Điều đầu tiên cần làm là bắt đầu bằng cách tạo một lớp đại diện cho dữ liệu từ cơ sở dữ liệu của bạn. Thông thường, tôi sẽ bắt đầu với Interface
và sử dụng một số loại nhà máy để tạo ra triển khai thực tế, nhưng các bước nhỏ ...
Điều này có một biến rất quan trọng, hasChanged
. Điều này được sử dụng để gắn cờ đối tượng cần được cập nhật ...
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;
}
}
}
Tiếp theo, chúng tôi xây dựng một mô hình bảng có khả năng mô hình hóa danh sách các đối tượng ...
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);
}
}
}
Có bất kỳ cách nào để đạt được điều tương tự, nhưng về cơ bản ở đây tôi đã cung cấp phương pháp có tên là getChangedPeople
sẽ trả về tất cả People
điều đó đã thay đổi. Sau đó, bạn chỉ cần lặp qua danh sách này và gọi câu lệnh cập nhật cơ sở dữ liệu thích hợp.