35使用模型操作数据库

前面使用 SQL 语句完成了对数据库的常规操作,包括简单的 CREATE、SELECT 等语句的使用。我们也提到过,Qt 不仅提供了这种使用 SQL 语句的方式,还提供了一种基于模型的更高级的处理方式。这种基于QSqlTableModel 的模型处理更为高级,如果对 SQL 语句不熟悉,并且不需要很多复杂的查询,这种QSqlTableModel模型基本可以满足一般的需求。本节我们将介绍QSqlTableModel的一般使用,对比 SQL 语句完成对数据库的增删改查等的操作。值得注意的是,QSqlTableModel并不一定非得结合 QListView或QTableView使用,我们完全可以用其作一般性处理。

查询操作

首先我们来看看如何使用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宏进行遍历。

注意:由于QSqlTableModel只是一种高级操作,肯定没有实际 SQL 语句方便。具体来说,我们使用QSqlTableModel只能进行 SELECT * 的查询,不能只查询其中某些列的数据。

插入操作

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

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 表示:

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

更新操作

当我们取出了已经存在的数据后,对其进行修改,然后重新写入数据库,即完成了一次更新操作:

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()函数。具体代码片段如下:

if (model.select()) {

if (model.rowCount() == 1) {

model.setData(model.index(0, 2), 26);

model.submitAll();

}

}

注意我们的 age 列是第 3 列,索引值为 2,因为前面还有 id 和 name 两列。这里的更新操作则可以用如下 SQL 表示:

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()函数就应该想到:我们可以一次删除多行。事实也正是如此,这里不再赘述。

原文地址:https://www.cnblogs.com/gd-luojialin/p/9215878.html

时间: 2024-11-10 22:50:26

35使用模型操作数据库的相关文章

.NET使用DAO.NET实体类模型操作数据库

一.新建项目 打开vs2017,新建一个项目,命名为orm1 二.新建数据库 打开 SqlServer数据库,新建数据库 orm1,并新建表 student . 三.新建 ADO.NET 实体数据模型 这里点击 新建连接,新建数据库连接.其实服务器名输入 . 代表本地服务器,身份验证选择默认的Windows身份认证. 选择我们的创建好的数据库 orm1 . 记住这里的连接名 orm1Entities ,后面写代码需要用到. 这里记得勾选表 点击完成就OK了,有可能会弹出下面的警告,点确定就好了.

「七天自制PHP框架」第二天:模型与数据库

往期回顾:「七天自制PHP框架」第一天:路由与控制器,点击此处 什么是模型? 我们的WEB系统一定会和各种数据打交道,实际开发过程中,往往一个类对应了关系数据库的一张或多张数据表,这里就会出现两个问题. 1.类和数据表,一方修改会导致另一方的修改,只要数据表结构不定下来,业务逻辑的开发几乎没法开工 2.获取数据时会牵涉很多SQL语句的拼接,如果数据结构变动,这些SQL需要改写 假如要开发一个博客系统,我们先设计两个Model和两张数据表 第一张数据表,表名是post,存储了博客文章,数据如下:

Java数据库连接——JDBC基础知识(操作数据库:增删改查)

一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库.比如建立数据库连接.执行SQL语句进行数据的存取操作. JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数据库 创

使用内置函数操作数据库

0.视频:http://www.imooc.com/video/3383 1.笔记: ContentValues: 1)用于存储一组可以被ContentResolve处理的值: 2)代码示例: ContentValues values=new ContentValues();//类似hashMap key value values.put("name", "张三"); 3)执行对应的Sql操作: db.update("stutb", values

封装JDBC操作数据库的方法

自己动手封装java操作数据库的方法: 一:目录结构 二:所需依赖的第三方jar包 这里只需引入mysql-connector-java-5.1.8-bin.jar,mysql数据库驱动jar包 三:代码 1:和数据库进行交互,首先是数据源,获取连接,代码如下: 1 /** 2 * 3 */ 4 package com.hlcui.datasource; 5 6 import java.sql.Connection; 7 import java.sql.DriverManager; 8 impo

超简单使用批处理(batch)操作数据库

超简单使用批处理(batch)操作数据库 批处理(batch)是什么 批处理的执行就好比快递员的工作: 未使用批处理的时候,快递员一次从分发点将一件快递发给客户: 使用批处理,则是快递员将所有要派送的快递都用车带到发放处派给客户. 批处理(batch)操作数据库 批处理指的是一次操作中执行多条SQL语句,批处理相比于一次一次执行效率会提高很多. 批处理操作数据库的过程主要是分两步: 1.将要执行的SQL语句保存 2.执行保存的SQL语句 如何实现批处理 Statement和PreparedSta

Android:日常学习笔记(10)———使用LitePal操作数据库

Android:日常学习笔记(10)---使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表.増删改查的操作.并且LitePal很"轻",jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别.目前LitePal的源码已经托管到了GitHub上. 关

Mysqli 操作数据库

每次用到mysql_connect连接数据库的时候都会提示: 1 Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in E:\wamp\www\myquote\includes\mysql_connect.php on line 5 作为一个高要求高完美的男人,实在受不了这提示.躲着他也不行——解决

QT 操作数据库

整理一下 QT 操作数据库的一些要点,以备以后的查询学习(主要是操作 mysql ). 首先,要查询相关的驱动是否已经装好了,可以用以下的程序进行验证: #include <QtCore/QCoreApplication> #include <QSqlDatabase> #include <QDebug> #include <QStringList> int main(int argc, char *argv[]) { QCoreApplication a(