前面幾章咱們介紹瞭如何對數據庫進行操做以及如何使用圖形界面展現數據庫數據。本章咱們將介紹如何對數據庫的數據進行編輯。固然,咱們能夠選擇直接使用 SQL 語句進行更新,這一點同前面所說的 model/view 的編輯沒有什麼區別。除此以外,Qt 還爲圖形界面提供了更方便的展現並編輯的功能。sql
普通數據的編輯很簡單,這裏再也不贅述。不過,咱們一般會遇到多個表之間存在關聯的狀況。首先咱們要提供一個 city 表:數據庫
CREATE TABLE city ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR); INSERT INTO city (name) VALUES ('Beijing'); INSERT INTO city (name) VALUES ('Shanghai'); INSERT INTO city (name) VALUES ('Nanjing'); INSERT INTO city (name) VALUES ('Tianjin'); INSERT INTO city (name) VALUES ('Wuhan'); INSERT INTO city (name) VALUES ('Hangzhou'); INSERT INTO city (name) VALUES ('Suzhou'); INSERT INTO city (name) VALUES ('Guangzhou');
因爲 city 表是一個參數表,因此咱們直接將所須要的城市名稱直接插入到表中。接下來咱們建立 student 表,而且使用外鍵鏈接 city 表:函數
CREATE TABLE student ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, address INTEGER, FOREIGN KEY(address) REFERENCES city(id));
咱們從新建立 student 表(若是你使用的 RDBMS 支持 ALTER TABLE 語句直接修改表結構,就不須要從新建立了;不然的話只能先刪除舊的表,再建立新的表,例如 sqlite)。this
這裏須要注意一點,若是此時咱們在 Qt 中直接使用code
INSERT INTO student (name, age, address) VALUES ('Tom', 24, 100);
語句,儘管咱們的 city 中沒有 ID 爲 100 的記錄,但仍是是能夠成功插入的。這是由於雖然 Qt 中的 sqlite 使用的是支持外鍵的 sqlite3,但 Qt 將外鍵屏蔽掉了。爲了啓用外鍵,咱們須要首先使用QSqlQuery
執行:sqlite
PRAGMA foreign_keys = ON;
而後就會發現這條語句不能成功插入了。接下來咱們插入一些正常的數據:對象
INSERT INTO student (name, age, address) VALUES ('Tom', 20, 2); INSERT INTO student (name, age, address) VALUES ('Jack', 23, 1); INSERT INTO student (name, age, address) VALUES ('Jane', 22, 4); INSERT INTO student (name, age, address) VALUES ('Jerry', 25, 5);
下面,咱們使用 model/view 方式來顯示數據:ci
QSqlTableModel *model = new QSqlTableModel(this); model->setTable("student"); model->setSort(ColumnID_Name, Qt::AscendingOrder); model->setHeaderData(ColumnID_Name, Qt::Horizontal, "Name"); model->setHeaderData(ColumnID_Age, Qt::Horizontal, "Age"); model->setHeaderData(ColumnID_City, Qt::Horizontal, "City"); model->select(); QTableView *view = new QTableView(this); view->setModel(model); view->setSelectionMode(QAbstractItemView::SingleSelection); view->setSelectionBehavior(QAbstractItemView::SelectRows); view->resizeColumnsToContents(); QHeaderView *header = view->horizontalHeader(); header->setStretchLastSection(true);
這段代碼和咱們前面見到的沒有什麼區別。咱們能夠將其補充完整後運行一下看看:it
注意外鍵部分:City 一列僅顯示出了咱們保存的外鍵。若是咱們使用QSqlQuery
,這些都不是問題,咱們能夠將外鍵信息放在一個 SQL 語句中 SELECT 出來。可是,咱們不想使用QSqlQuery
,那麼如今可使用另外的一個模型:QSqlRelationalTableModel
。QSqlRelationalTableModel
與QSqlTableModel
十分相似,能夠爲一個數據庫表提供可編輯的數據模型,同時帶有外鍵的支持。下面咱們修改一下咱們的代碼:io
QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this); model->setTable("student"); model->setSort(ColumnID_Name, Qt::AscendingOrder); model->setHeaderData(ColumnID_Name, Qt::Horizontal, "Name"); model->setHeaderData(ColumnID_Age, Qt::Horizontal, "Age"); model->setHeaderData(ColumnID_City, Qt::Horizontal, "City"); model->setRelation(ColumnID_City, QSqlRelation("city", "id", "name")); model->select(); QTableView *view = new QTableView(this); view->setModel(model); view->setSelectionMode(QAbstractItemView::SingleSelection); view->setSelectionBehavior(QAbstractItemView::SelectRows); view->resizeColumnsToContents(); view->setItemDelegate(new QSqlRelationalDelegate(view)); QHeaderView *header = view->horizontalHeader(); header->setStretchLastSection(true);
這段代碼同前面的幾乎同樣。咱們首先建立一個QSqlRelationalTableModel
對象。注意,這裏咱們有一個setRelation()
函數的調用。該語句說明,咱們將第ColumnID_City
列做爲外鍵,參照於 city 表的 id 字段,使用 name 進行顯示。另外的setItemDelegate()
語句則提供了一種用於編輯外鍵的方式。運行一下程序看看效果:
此時,咱們的外鍵列已經顯示爲 city 表的 name 字段的實際值。同時在編輯時,系統會自動成爲一個QComboBox
供咱們選擇。固然,咱們須要本身將選擇的外鍵值保存到實際記錄中,這部分咱們前面已經有所瞭解。