前面几章咱们介绍了如何对数据库进行操做以及如何使用图形界面展现数据库数据。本章咱们将介绍如何对数据库的数据进行编辑。固然,咱们能够选择直接使用 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
供咱们选择。固然,咱们须要本身将选择的外键值保存到实际记录中,这部分咱们前面已经有所了解。