Qt数据库(5) – 使用SQL Model类「建议收藏」

Qt数据库(5) – 使用SQL Model类「建议收藏」Qt助手关键字:Using the SQL Model Classes Qt Version 5.14.0 除了QSqlQuery,Qt还提供了三个高级类用来访问数据库,分别为QSqlQueryMo…

Qt数据库(5) - 使用SQL Model类

Qt Version 5.14.0

除了QSqlQuery,Qt还提供了三个高级类用来访问数据库,分别为QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel。

  • QSqlQueryModel 基于任意SQL语句的只读模型
  • QSqlTableModel 只对一张表进行操作的读写模型
  • QSqlRelationalTableModel QSqlTableModel的子类,支持外键

这三个类继承自QAbstractTableModel,这使得在ItemView类(比如QTableVIew、QListView、QTreeView)中显示数据库中的数据变得很简单。具体细节详见Qt助手关键字:Presenting Data in a Table View。

The SQL Query Model

QSqlQueryModel提供一个只读模型,该模型数据基于SQL query。示例代码如下:

QSqlQueryModel model;
model.setQuery("SELECT * FROM employee");

代码100分

设置完SQL语句之后,可以使用record(int)函数来访问单独的记录,代码如下:

代码100分for (int i = 0; i < model.rowCount(); ++i) 
{
 	int id = model.record(i).value("id").toInt();
	QString name = model.record(i).value("name").toString();
	qDebug() << id << name;
 }

也可以使用从QAbstractItemModel继承的接口来访问model中的数据。 setQuery()接口还有一个重载函数,可以接收QSqlQuery对象作为参数,这样就可以利用QSqlQuery所有特性,比如占位符。

The SQL Table Model

QSqlTableModel提供一次只作用于一张表的可读写模型。示例代码如下:

 QSqlTableModel model;
 model.setTable("employee");
 model.setFilter("salary > 50000");
 model.setSort(2, Qt::DescendingOrder);
 model.select();

 for (int i = 0; i < model.rowCount(); ++i) 
 {
 	QString name = model.record(i).value("name").toString();
 	int salary = model.record(i).value("salary").toInt();
  	qDebug() << name << salary;
 }

用代码修改表中数据的流程如下:

  • 获取某一行record:model.record(i)
  • 修改record中某个字段对应的数据:record.setValue(“字段名”, 值)
  • 替换model中对应位置record:model.setRecord()

也可以使用从QAbstractItemModel继承的接口data()和setData(),以下代码调用setData接口完成model中的数据刷新

代码100分model.setData(model.index(row, column), 75000);
model.submitAll();

数据插入

model.insertRows(row, 1);
model.setData(model.index(row, 0), 1013);
model.setData(model.index(row, 1), "Peter Gordon");
model.setData(model.index(row, 2), 68500);
model.submitAll();

删除5行连续数据

model.removeRows(row, 5);
model.submitAll();

修改何时生效

当你修改记录时,需要调用QSqlTableModel::submitAll()来保证修改已经被写入数据库。而何时调用这个函数取决于QSqlTableModel的编辑策略

  • QSqlTableModel::OnFieldChange:无缓存,一有修改立刻写入数据库
  • SqlTableModel::OnRowChange:缓存某一行修改,当你选择其它行时,之前的修改立刻写入数据库
  • QSqlTableModel::OnManualSubmit:缓存所有修改,直到手动调用submitAll()或revertAll()

注意:对于新插入行,OnFieldChange行为与OnRowChange一致。

The SQL Relational Table Model

QSqlRelationalTableModel对QSqlTableModel进行了扩展,提供了外键支持。 Qt数据库(5) - 使用SQL Model类「建议收藏」

如上图,左表使用QSqlTableModel,第三、四列存储的是另一个地址表的主键,不利于阅读。右表使用QSqlRelationalTableModel,可以将地址表的主键自动替换成某个其它字段,便于阅读。 示例代码如下:

 model->setTable("employee");
 model->setRelation(2, [QSqlRelation](qsqlrelation.html)("city", "id", "name"));
 model->setRelation(3, [QSqlRelation](qsqlrelation.html)("country", "id", "name"));

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10123.html

(0)
上一篇 2023-01-25
下一篇 2023-01-25

相关推荐

  • 怎样优化oracle数据库,有几种方式_数据库设计的技巧

    怎样优化oracle数据库,有几种方式_数据库设计的技巧数据库之Oracle优化技巧(一) 1.where子句中的连接顺序 在Oracle数据库中,where子句的执行顺序是自下而上进行解析,根据这个原理,表之间的连接必须写在其他where条件之前,那些可

    2023-03-06
    97
  • 【SQL SERVER重新认识】数据内部存储结构简单探索「终于解决」

    【SQL SERVER重新认识】数据内部存储结构简单探索「终于解决」探索数据库内部存储数据存储结构,将从数据库内部如何存储数据,索引数据如何存储,操作数据对存储影响,最后总结。

    2023-02-12
    107
  • 【赵强老师】Flink的Watermark机制(基于Flink 1.11.0实现)

    【赵强老师】Flink的Watermark机制(基于Flink 1.11.0实现)在使用eventTime的时候如何处理乱序数据?我们知道,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件

    2023-03-24
    117
  • MongoDB与MySQL关于写确认的异同[通俗易懂]

    MongoDB与MySQL关于写确认的异同[通俗易懂]云妹导读: 所谓写确认,是指用户将数据写入数据库之后,数据库告知用户写入成功的一个概念。根据数据库的特点和配置,可以在不同的写入程度上,返回给用户,而这其中,就涉及到了不同的性能、数据安全等级以及数…

    2023-03-13
    96
  • 使用Python创建网页

    使用Python创建网页如今,随着互联网的迅速发展,越来越多的人开始探索网页设计。而Python作为一门功能强大的编程语言,被越来越多的人用于网页开发。本篇文章将详细介绍如何使用Python创建优美、实用的网页。

    2024-04-30
    15
  • 我眼中的大数据(一)[通俗易懂]

    我眼中的大数据(一)[通俗易懂]前言 在正式落地谈技术之前,先花一些篇幅说说大数据技术的发展史。我们常说的大数据技术,其实起源于Google在2004年前后发表的三篇论文,分别是分布式文件系统GFS、大数据分布式计算框架MapRed

    2023-06-07
    104
  • Python在/usr/local/bin上的应用

    Python在/usr/local/bin上的应用Python语言是一种面向对象的解释型语言,被广泛应用于Web开发、人工智能、科学计算等领域。Python的优点在于简单易学、代码可读性高以及拥有丰富的第三方库支持。在本篇文章中,我们将探讨Python在/usr/local/bin中的应用。

    2023-12-18
    62
  • mysql整体迁移_anaconda环境迁移

    mysql整体迁移_anaconda环境迁移一次生产环境mysql迁移操作(一)数据归档 一次生产环境mysql迁移操作(二)mysql空间释放(碎片整理) 背景 在项目过程中我们经常要对数据库进行迁移、归档、拆分等等操作,现在描述下几种方案…

    2023-01-25
    115

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注