Qt 学习之路 2(56):使用模型操作数据库
2017-10-02 10:46
375 查看
前一章我们使用 SQL 语句完成了对数据库的常规操作,包括简单的 CREATE、SELECT 等语句的使用。我们也提到过,Qt 不仅提供了这种使用 SQL 语句的方式,还提供了一种基于模型的更高级的处理方式。这种基于
SQL 语句不熟悉,并且不需要很多复杂的查询,这种
SQL 语句完成对数据库的增删改查等的操作。值得注意的是,
首先我们来看看如何使用
我们依旧使用了前一章的
使用
另外需要注意,由于
SELECT * 的查询,不能只查询其中某些列的数据。
下面一段代码则显示了如何使用
插入也很简单:
当我们取出了已经存在的数据后,对其进行修改,然后重新写入数据库,即完成了一次更新操作:
这段代码中,我们首先找到 age = 25 的记录,然后将 age 重新设置为 26,存入相同的位置(在这里都是索引 0 的位置),提交之后完成一次更新。当然,我们也可以类似其它模型一样的设置方式:
注意我们的 age 列是第 3 列,索引值为 2,因为前面还有 id 和 name 两列。这里的更新操作则可以用如下 SQL 表示:
PgSQL
删除操作同更新类似:
如果使用 SQL 则是:
PgSQL
当我们看到
QSqlTableModel的模型处理更为高级,如果对
SQL 语句不熟悉,并且不需要很多复杂的查询,这种
QSqlTableModel模型基本可以满足一般的需求。本章我们将介绍
QSqlTableModel的一般使用,对比
SQL 语句完成对数据库的增删改查等的操作。值得注意的是,
QSqlTableModel并不一定非得结合
QListView或
QTableView使用,我们完全可以用其作一般性处理。
首先我们来看看如何使用
QSqlTableModel进行 SELECT 操作:
123456789101112131415 | 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 语句PgSQL
1 | SELECT * FROM student WHERE age > 20 and age < 25 |
QSqlTableModel::select()函数进行操作,也就是执行了查询操作。如果查询成功,函数返回 true,由此判断是否发生了错误。如果没有错误,我们使用
record()函数取出一行记录,该记录是以
QSqlRecord的形式给出的,而
QSqlRecord::value()则取出一个列的实际数据值。注意,由于
QSqlTableModel没有提供
const_iterator遍历器,因此不能使用
foreach宏进行遍历。
另外需要注意,由于
QSqlTableModel只是一种高级操作,肯定没有实际 SQL 语句方便。具体来说,我们使用
QSqlTableModel只能进行
SELECT * 的查询,不能只查询其中某些列的数据。
下面一段代码则显示了如何使用
QSqlTableModel进行插入操作:
1234567 | 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 表示:PgSQL
1 | INSERT INTO student (name, age) VALUES ('Cheng', 24) |
1234567891011 | 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(); }} |
setData()函数。具体代码片段如下:
1 2 3 4 5 6 | if (model.select()) { if (model.rowCount() == 1) { model.setData(model.index(0, 2), 26); model.submitAll(); } } |
PgSQL
1 | UPDATE student SET age = 26 WHERE age = 25 |
1 2 3 4 5 6 7 8 9 | QSqlTableModel model; model.setTable("student"); model.setFilter("age = 25"); if (model.select()) { if (model.rowCount() == 1) { model.removeRows(0, 1); model.submitAll(); } } |
PgSQL
1 | DELETE FROM student WHERE age = 25 |
removeRows()函数就应该想到:我们可以一次删除多行。事实也正是如此,这里不再赘述。
相关文章推荐
- QT学习之路————使用QT自带的QSqlDatabase类简单操作sqlite数据库
- Qt 学习之路 2(55):数据库操作
- Qt学习之路:数据库操作(1)
- ThinkPHP学习笔记(五)使用模型操作数据库之CURD
- SpringBoot学习之路:03.Spring Boot使用Jpa操作数据库
- Qt 学习之路 2(55):数据库操作
- Qt使用 QSqlTableModel 模型操作数据库
- 【Qt笔记】使用模型操作数据库
- Qt学习之路_8(Qt中与文件目录相关操作)
- Qt学习之路_8(Qt中与文件目录相关操作)
- ACCP学习旅程之-----使用C#开发数据库应用程序(第七章 用ADO.NET查询和操作数据库)
- Qt学习之路_5(Qt TCP的初步使用)
- QT数据库连接操作基本学习教程
- 【Spring学习笔记】五、使用JDBCTemplate以对象方式操作数据库
- C#学习笔记(六)-使用ADO .NET查询和操作数据库
- Qt学习之路_4(Qt UDP的初步使用)
- iOS学习笔记(十六)——数据库操作(使用FMDB)
- 使用QT对access数据库进行操作——数据库中表、记录和域的读取
- Qt学习之路_5(Qt TCP的初步使用)
- iOS学习笔记(十六)——数据库操作(使用FMDB)