【Qt笔记】使用模型操做数据库

前一章咱们使用 SQL 语句完成了对数据库的常规操做,包括简单的 CREATE、SELECT 等语句的使用。咱们也提到过,Qt 不只提供了这种使用 SQL 语句的方式,还提供了一种基于模型的更高级的处理方式。这种基于QSqlTableModel 的模型处理更为高级,若是对 SQL 语句不熟悉,而且不须要不少复杂的查询,这种QSqlTableModel模型基本能够知足通常的需求。本章咱们将介绍QSqlTableModel的通常使用,对比 SQL 语句完成对数据库的增删改查等的操做。值得注意的是,QSqlTableModel并不必定非得结合 QListViewQTableView使用,咱们彻底能够用其做通常性处理。sql

 

首先咱们来看看如何使用QSqlTableModel 进行 SELECT 操做:数据库

if (connect("demo.db")) {
    QSqlTableModel model;
    model.setTable("student");
    model.setFilter("age > 20 and age < 25");
    if (model.select()) {
        for (int i = 0; i < model.rowCount(); ++i) {
            QSqlRecord record = model.record(i);
            QString name = record.value("name").toString();
            int age = record.value("age").toInt();
            qDebug() << name << ": " << age;
        }
    }
} else {
    return 1;
}

咱们依旧使用了前一章的connect()函数。接下来咱们建立了QSqlTableModel实例,使用setTable()函数设置所须要操做的表格;setFilter()函数则是添加过滤器,也就是 WHERE 语句所须要的部分。例如上面代码中的操做实际至关于 SQL 语句函数

SELECT * FROM student WHERE age > 20 and age < 25

使用QSqlTableModel::select()函数进行操做,也就是执行了查询操做。若是查询成功,函数返回 true,由此判断是否发生了错误。若是没有错误,咱们使用record()函数取出一行记录,该记录是以QSqlRecord的形式给出的,而QSqlRecord::value()则取出一个列的实际数据值。注意,因为QSqlTableModel没有提供const_iterator遍历器,所以不能使用foreach宏进行遍历。code

另外须要注意,因为QSqlTableModel只是一种高级操做,确定没有实际 SQL 语句方便。具体来讲,咱们使用QSqlTableModel只能进行 SELECT * 的查询,不能只查询其中某些列的数据。索引

下面一段代码则显示了如何使用QSqlTableModel进行插入操做:rem

QSqlTableModel model;
model.setTable("student");
int row = 0;
model.insertRows(row, 1);
model.setData(model.index(row, 1), "Cheng");
model.setData(model.index(row, 2), 24);
model.submitAll();

插入也很简单:model.insertRows(row, 1);说明咱们想在索引 0 的位置插入 1 行新的数据。使用setData()函数则开始准备实际须要插入的数据。注意这里咱们向 row 的第一个位置写入 Cheng(经过model.index(row, 1),回忆一下,咱们把 model 看成一个二维表,这个坐标至关于第 row 行第 1 列),其他以此类推。最后,调用submitAll()函数提交全部修改。这里执行的操做能够用以下 SQL 表示:it

INSERT INTO student (name, age) VALUES ('Cheng', 24)

当咱们取出了已经存在的数据后,对其进行修改,而后从新写入数据库,即完成了一次更新操做:class

QSqlTableModel model;
model.setTable("student");
model.setFilter("age = 25");
if (model.select()) {
    if (model.rowCount() == 1) {
        QSqlRecord record = model.record(0);
        record.setValue("age", 26);
        model.setRecord(0, record);
        model.submitAll();
    }
}

这段代码中,咱们首先找到 age = 25 的记录,而后将 age 从新设置为 26,存入相同的位置(在这里都是索引 0 的位置),提交以后完成一次更新。固然,咱们也能够相似其它模型同样的设置方式:setData()函数。具体代码片断以下:foreach

if (model.select()) {
    if (model.rowCount() == 1) {
        model.setData(model.index(0, 2), 26);
        model.submitAll();
    }
}

注意咱们的 age 列是第 3 列,索引值为 2,由于前面还有 id 和 name 两列。这里的更新操做则能够用以下 SQL 表示:List

UPDATE student SET age = 26 WHERE age = 25

删除操做同更新相似:

QSqlTableModel model;
model.setTable("student");
model.setFilter("age = 25");
if (model.select()) {
    if (model.rowCount() == 1) {
        model.removeRows(0, 1);
        model.submitAll();
    }
}

若是使用 SQL 则是:

DELETE FROM student WHERE age = 25

当咱们看到removeRows()函数就应该想到:咱们能够一次删除多行。事实也正是如此,这里再也不赘述。

相关文章
相关标签/搜索