Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作。这里我们所说的“平台
独立”,既包括操作系统平台,也包括各个数据库平台,Qt支持以下几种数据库:

  • QT自带SQLITE数据库,不需要再安装
  • QTDS在Qt4.7起已经被移除

1.QtSql

要使用QtSql 模块的话,需要在.pro文件中添加这么一句:

QT += sql 

2.QSqlDatabase

QSqlDatabase类提供了一个接口,用于通过连接访问数据。QSqlDatabase的一个实例表示连接。该连接通过受支持的数据库驱动程序之一提供对数据库的访问,该驱动程序派生自QSqlDriver。

2.1 创建一个数据库示例如下

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(QApplication::applicationDirPath()+"/scooters.dat"); //如果本目录下没有该文件,则会在本目录下生成,否则连接该文件
if (!db.open()) {
QMessageBox::warning(, QObject::tr("Database Error"),
db.lastError().text());
return false;
}

编译运行后,可以看到已经创建了该文件:

创建成功后,该文件默认为空的,然后就可以使用QSqlQuery类来操作该数据库, QSqlQuery类使用的是SQL语句,如果只需要使用高层次的数据
库接口(不关心 SQL 语法),我们可以选择 QSqlTableModel 和
QSqlRelationalTableModel(在后续章节介绍)。本章我们介绍
QSqlQuery 类,来如何使用SQL语法.

3.QSqlQuery类介绍

通过exec()成员函数来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE和DELETE,以及DDL(数据定义语言)语句等.

比如:

QSqlQuery query;
query.exec("DROP TABLE students"); //删除名为students的表

4.接下来,我们讲讲如何导入数据

创建表:

query.exec("CREATE TABLE students ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(40) NOT NULL, "
" score INTEGER NOT NULL, "
"class VARCHAR(40) NOT NULL)");
//创建一个students表,标题分别为id、name、score、class

" PRIMARY KEY AUTOINCREMENT,":表示该列为整数递增,如果为空时则自动填入1,然后在下面的每一行都会自动+1, PRIMARY KEY则表示该列作为列表的主键,通过它可以轻易地获取某一行数据

" INTEGER ":表示该列为带符号的整数

" VARCHAR(40) ":表示该列为可变长字符串,默认只能存储英文和数字或者utf-8,最多存储40个字节.

"NOT NULL ":表示该列的内容不为空

导入数据:

query.exec("INSERT INTO students (name, score,class) "
"VALUES ('小张', 85, '初2-1班')");
//向students表里的(name, score,class)标题下插入一项数据'小张', 85, '初2-1班'

添加后如下图所示:

5.批量导入库

如果我们有大串数据需要导入时,也可以使用prepare()来绑值,然后再通过bindValue()向绑值加入数据

示例代码如下所示:

QStringList names;
names<<"小A"<<"小B"<<"小C"<<"小D"<<"小E"<<"小F"<<"小G"
<<"小H"<<"小I"<<"小G"<<"小K"<<"小L"<<"小M"<<"小N"; QStringList clases;
clases<<"初1-1班"<<"初1-2班"<<"初1-3班"<<"初2-1班"
<<"初2-2班"<<"初2-3班"<<"初3-1班"<<"初3-2班"<<"初3-3班"; QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(QApplication::applicationDirPath()+"/scooters.dat"); //在本目录下生成
QSqlQuery query;
query.exec("DROP TABLE students"); //先清空一下表
query.exec("CREATE TABLE students ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(40) NOT NULL, "
" score INTEGER NOT NULL, "
"class VARCHAR(40) NOT NULL)");
//创建一个students表 query.prepare("INSERT INTO students (name, score,class) "
"VALUES (:name, :score, :class)");
//为每一列标题添加绑定值 foreach (QString name, names) //从names表里获取每个名字
{
query.bindValue(":name", name); //向绑定值里加入名字
query.bindValue(":score", (qrand() % )); //成绩
query.bindValue(":class", clases[qrand()%clases.length()] ); //班级
query.exec(); //加入库中
}

运行后,通过SQLite工具打开students.dat,如下图所示:

6.查询表内容

我们对上图生成的students.dat文件进行查询内容时,则需要使用WHERE 关键字实现.

示例-查询成绩值为60~80之间的学生:

    query.exec("SELECT * FROM students WHERE score >= 60 AND score <= 80;");
while(query.next())
{
QString id = query.value().toString();
QString name = query.value().toString();
QString score = query.value().toString();
QString classs = query.value().toString(); qDebug()<<id<<name<<score<<classs;
}

运行打印:

当然还有其它语句,比如:

"SELECT * FROM students WHERE score >= 80 OR class == '初3-3班';"
//判断成绩大于等于80,或者班级为初3-3班的

打印如下图所示:

 "SELECT * FROM students WHERE class GLOB '*3-3*';"
// GLOB表示通配符,匹配班级带有"3-3"的名字

打印如下图所示:

PS:如果想查询所有内容,则改为 query.exec("SELECT * FROM students ");

7.删表内容

删表内容有3个语句:

  • DROP:          用来删除整表,并且连表结构也会删除,删除后则只能使用CREATE TABLE来重新创建表
  • TRUNCATE:   在SQLite中没有该语句,在MySQL中有该语句,用来清楚表内数据,但是表结构不会删除.
  • DELETE:      删除部分记录,并且表结构不会删除,删除的速度比上面两个语句慢,可以配合WHERE来删除指定的某行

示例1

query.exec("DELETE FROM students");           //删除students表里所有内容

删除后如下图所示:

示例2-删除id=3的一行

query.exec("DELETE FROM students WHERE  id = 3");

删除前:

删除后:

8.改表内容

改表内容一般用下面两个语句:

  • UPDATE :      用来修改表中内容,可以通过WHERE语句来指定修改
  • ALTER  TABLE:  用来重命名表,或者在已有的表中添加新的一列

8.1 ALTER 示例

示例1

query.exec("ALTER TABLE students RENAME TO new_students");      //将students重命名为new_students

运行后如下图所示:

 示例2

query.exec("ALTER TABLE  new_students ADD COLUMN 结果 VARCHAR(10)");
//向 new_students表里添加新的一列,标题为结果,内容格式为VARCHAR

运行后如下图所示:

8.2 UPDATE 示例

示例1-不使用WHERE,直接修改某列

query.exec("UPDATE  new_students  SET score = 100 , name = '小A'");
//修改score和name所在的列内容

修改后如下图所示:

示例2-使用WHERE,判断小于60的设为不合格,否则设为合格

query.exec("UPDATE  new_students  SET 结果='不合格'  WHERE  score<60 ");
query.exec("UPDATE new_students SET 结果='合格' WHERE score>=60 ");

修改前如下图所示:

修改后:

42.QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解的更多相关文章

  1. Qt 操作SQLite数据库

    项目中通常需要采用各种数据库(如 Qracle.SQL Server.MySQL等)来实现对数据的存储.查询等功能.下面讲解如何在 Qt 中操作 SQlite 数据库. 一.SQLite 介绍 Sql ...

  2. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  3. EF6操作Sqlite数据库的项目兼容性问题

    vs2010无法正确打开2015创建的项目里面操作Sqlite数据库时使用EF6创建的edmx文件(会显示空白)   但是可以正常查询 vs2015无法正确打开2010创建的项目里面操作Sqlite数 ...

  4. JDBC访问及操作SQLite数据库

    SQLite 是一个开源的嵌入式关系数据库,其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进 ...

  5. UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库

    在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...

  6. Android中操作SQLite数据库

    我又回到了安卓的学习当中,忙来忙去终于忙的差不多有时间做自己的事情了,这感觉实在是太棒了!!本来想写android的控件以及他们的监视器的,但是我查了查android的手册,基本上都能查到,但是查有些 ...

  7. 如何C#操作SQLite数据库

    或许有人之前在java开发中使用过SQLite,对它有些印象.在用Winform或Wpf开发小应用程序时,发现用SQLite数据库也是不错的.就像一个会员管理软件,开发完毕后,可以省去想sqlserv ...

  8. C#操作SQLite数据库增、删、改、查 欢迎转载

    C#操作SQLite数据库增.删.改.查 欢迎转载 转载记得留下链接地址哦!!! 最近项目上要使用SQLite数据库,不怕大伙笑话毕业四年多了,一直使用Oracle或者MySQL或者SQLServer ...

  9. Python操作SQLite数据库的方法详解

    Python操作SQLite数据库的方法详解 本文实例讲述了Python操作SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite简单介绍 SQLite数据库是一款非常小巧的嵌入式开 ...

随机推荐

  1. Sniper OJ部分writeup

    0x00 shellcode pwn 因为题目直接有源码,我就不拖进IDA了,直接看代码 这是一个典型的栈溢出,我们只需要构造shellcode获得/bin/sh权限就可以得到flag.下面是所用脚本 ...

  2. poi导出word模板项目实例(一个文件)

    在页面上填写值,然后导出到word模板中,并把页面上的值带到模板中,也就是导出word文档,提前有word 的模板形式, 1.jsp 页面   <table class="formTa ...

  3. 学c++有感

    第一次学习这么课程的时候,感觉课堂和教材的内容基本上都能接受和理解,但真正实际动手编写程序又觉得一片空白无从下手,可谓是“欲起平之恨无力.”一开始编写程序时,总是出现错误,从而产生了恐惧感,认为自己不 ...

  4. [LUOGU] P2245 星际导航

    题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向图,顶点表示各个星系, ...

  5. Git学习——查看修改记录

    查看修改结果 修改之前commit的文件,输入下面的而命令,可以查看文件的改动,输入下面命令.还可以采用git diff命令来看看具体修改了什么. 如果确认无误,添加add和提交commit文件. g ...

  6. 使用Hexo+Github搭建属于自己的博客

    工具:Visual Studio Code/MarkdownPad技术:Hexo+Github 创建Github项目 Github账户注册和新建项目,项目必须要遵守格式:账户名.github.io,不 ...

  7. web开发框架之DRF

    RESTful架构解释: # Representational State Transfer 表现层状态转化 到底什么是RESTFul架构: 如果一个架构符合REST原则,就称它为RESTful架构. ...

  8. PAT Basic 1066

    1066 图像过滤 图像过滤是把图像中不重要的像素都染成背景色,使得重要部分被凸显出来.现给定一幅黑白图像,要求你将灰度值位于某指定区间内的所有像素颜色都用一种指定的颜色替换. 输入格式: 输入在第一 ...

  9. 【LeetCode】Broken Calculator(坏了的计算器)

    这道题是LeetCode里的第991道题. 题目描述: 在显示着数字的坏计算器上,我们可以执行以下两种操作: 双倍(Double):将显示屏上的数字乘 2: 递减(Decrement):将显示屏上的数 ...

  10. HDU 3947 River Problem

    River Problem Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ...