QSqlQuery类操作SQLite(创建、查询、删除、修改)详解

2024-06-11 21:08

本文主要是介绍QSqlQuery类操作SQLite(创建、查询、删除、修改)详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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("scooters.dat");     //如果本目录下没有该文件,则会在本目录下生成,否则连接该文件if (!db.open()) {                     QMessageBox::warning(0, 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("students.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() % 101));      //成绩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(0).toString();QString name = query.value(1).toString();QString score = query.value(2).toString();QString classs = query.value(3).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 ");

修改前如下图所示:

 

修改后:

注意:QT自带SQLITE数据库,不需要再安装

 

1.创建一个包含创建、查询、修改和删除数据库的数据库类(DataBase)

DataBase.h头文件

复制代码

#pragma once#include <QObject>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlDriver>
#include <QtSql/QSqlError>
#include "client_global.h"struct StudentData
{QString name;int score;QString grade;
};class DataBase : public QObject
{Q_OBJECTpublic:DataBase(QString name,QObject *parent=0);~DataBase();public:bool insertData(StudentData data);bool deleteData(int name);bool getDataByName(int name, StudentData & data);bool getDataList(QList<StudentData> & list);bool update();
private:QSqlDatabase m_DataBase;
private:bool initTable();bool isExistTable(QString table);bool createTable(QString table);
};

复制代码

 

DataBase.cpp源文件

复制代码

#include "XDataBase.h"
#include <QCoreApplication>
#include <QDebug>
#include <QSqlRecord>DataBase::DataBase(QString name, QObject *parent): QObject(parent)
{if (QSqlDatabase::contains(name)) {m_DataBase = QSqlDatabase::database(name);}else {m_DataBase = QSqlDatabase::addDatabase("QSQLITE");m_DataBase.setDatabaseName(QCoreApplication::applicationDirPath()+"/"+ name+".db");}initTable();
}DataBase::~DataBase()
{
}bool DataBase::initTable()
{if (!m_DataBase.open()) {return false;}if (!isExistTable("students")) {createTable("students");}return false;
}bool DataBase::isExistTable(QString table)
{bool bRet = false;if (!m_DataBase.open()) {return bRet;}QSqlQuery query(m_DataBase);query.exec(QString("select count(*) from sqlite_master where type='table' and name='%1'").arg(table));    //关键的判断      if (query.next()){if (query.value(0).toInt() > 0){bRet = true;}}return false;
}bool DataBase::createTable(QString table)
{if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);if (table == QString("students")) {bool success = query.exec("CREATE TABLE students (""id INTEGER PRIMARY KEY AUTOINCREMENT, ""name VARCHAR(40) NOT NULL, ""score INTEGER NOT NULL, ""grade VARCHAR(40) NOT NULL)");if (success) {return true;   //新建数据库成功}else {QSqlError lastError = query.lastError();QString err = lastError.driverText();return false;}}else {return false;}
}bool DataBase::insertData(StudentData data)
{if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);bool success = query.exec(QString("INSERT INTO students (name, score,class) ""VALUES (%1, %2, %3)").arg(data.name).arg(data.score).arg(data.grade));if (!success) {QSqlError lastError = query.lastError();QString err = lastError.driverText();return false;}return true;
}bool DataBase::deleteData(QString name)
{if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);query.prepare(QString("DELETE FROM students WHERE name='%1'").arg(name));query.exec();return false;
}bool DataBase::getDataByName(int name, StudentData & data)
{if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);query.prepare(QString("SELECT * FROM students WHERE name='%1'").arg(name));query.exec();QSqlRecord rec = query.record();if (query.next()){data.name = query.value(0).toString();data.score = query.value(1).toInt();data.grade = query.value(2).toString();return true;}return false;
}bool DataBase::getDataList(QList<StudentData>& list)
{if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);query.prepare(QString("SELECT * FROM students"));query.exec();QSqlRecord rec = query.record();while (query.next()){StudentData data;device.name = query.value(0).toInt();device.score = query.value(1).toString();device.grade = query.value(2).toInt();list.append(data); return true;}return false;
}bool DataBase::update()
{if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);query.prepare("UPDATE students SET score = 100 , name = '小A'");query.exec();return false;
}

复制代码

 

 

 

调用:

XClientApp.h头文件

复制代码

#pragma once#include <QApplication>
#include <DataBase.h>
#include "ServerAPI.h"
#define clientApp static_cast<XClientApp*>(QCoreApplication::instance())class XClientApp : public QApplication
{Q_OBJECTpublic:XClientApp(int argc, char *argv[]);~XClientApp();DataBase* getDataBase();ServerAPI* getServerAPI();QString getAppName();
private:void setFont(QString font);void setStyle();
private:DataBase* m_pDataBase;ServerAPI* m_pServerAPI;
signals:void sglSystemMessage(QString type, QString data);
};

复制代码

 

 

XClientApp.cpp源文件

 

复制代码

#include "XClientApp.h"XClientApp::XClientApp(int argc, char *argv[]): QApplication(argc, argv)
{m_pDataBase = new DataBase("xclient", this);setWindowIcon(QIcon(":/Images/Resources/朱砂古镇.ico"));//可执行程序图标setStyle();m_pServerAPI = new ServerAPI(this);   //注意有重载
}DataBase * XClientApp::getDataBase()   //获取本地数据库并进行操作
{return m_pDataBase;
}

复制代码

 

这篇关于QSqlQuery类操作SQLite(创建、查询、删除、修改)详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052286

相关文章

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java中的stream流分组示例详解

《Java中的stream流分组示例详解》Java8StreamAPI以函数式风格处理集合数据,支持分组、统计等操作,可按单/多字段分组,使用String、Map.Entry或Java16record... 目录什么是stream流1、根据某个字段分组2、按多个字段分组(组合分组)1、方法一:使用 Stri

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解