普通数据的编辑很简单,这里不再赘述。不过,我们通常会遇到多个表之间存在关联的情况。首先我们要提供一个 city 表:

    由于 city 表是一个参数表,所以我们直接将所需要的城市名称直接插入到表中。接下来我们创建 student 表,并且使用外键连接 city 表:

    1. id INTEGER PRIMARY KEY AUTOINCREMENT,
    2. name VARCHAR,
    3. age INTEGER,
    4. address INTEGER,
    5. FOREIGN KEY(address) REFERENCES city(id));

    我们重新创建 student 表(如果你使用的 RDBMS 支持 ALTER TABLE 语句直接修改表结构,就不需要重新创建了;否则的话只能先删除旧的表,再创建新的表,例如 sqlite)。

    语句,尽管我们的 city 中没有 ID 为 100 的记录,但还是是可以成功插入的。这是因为虽然 Qt 中的 sqlite 使用的是支持外键的 sqlite3,但 Qt 将外键屏蔽掉了。为了启用外键,我们需要首先使用执行:

    1. PRAGMA foreign_keys = ON;

    然后就会发现这条语句不能成功插入了。接下来我们插入一些正常的数据:

    下面,我们使用 model/view 方式来显示数据:

    1. model->setTable("student");
    2. model->setSort(ColumnID_Name, Qt::AscendingOrder);
    3. model->setHeaderData(ColumnID_Name, Qt::Horizontal, "Name");
    4. model->setHeaderData(ColumnID_Age, Qt::Horizontal, "Age");
    5. model->setHeaderData(ColumnID_City, Qt::Horizontal, "City");
    6. model->select();
    7. QTableView *view = new QTableView(this);
    8. view->setModel(model);
    9. view->setSelectionMode(QAbstractItemView::SingleSelection);
    10. view->setSelectionBehavior(QAbstractItemView::SelectRows);
    11. view->resizeColumnsToContents();
    12.  
    13. header->setStretchLastSection(true);

    注意外键部分:City 一列仅显示出了我们保存的外键。如果我们使用QSqlQuery,这些都不是问题,我们可以将外键信息放在一个 SQL 语句中 SELECT 出来。但是,我们不想使用QSqlQuery,那么现在可以使用另外的一个模型:。QSqlRelationalTableModelQSqlTableModel十分类似,可以为一个数据库表提供可编辑的数据模型,同时带有外键的支持。下面我们修改一下我们的代码:

    这段代码同前面的几乎一样。我们首先创建一个对象。注意,这里我们有一个setRelation()函数的调用。该语句说明,我们将第ColumnID_City列作为外键,参照于 city 表的 id 字段,使用 name 进行显示。另外的语句则提供了一种用于编辑外键的方式。运行一下程序看看效果: