当前位置: 首页 > news >正文

Qt 数据库SQLite 使用【01】基本功能

1.开发背景

        Qt 开发过程中难免需要存储数据,可以选择保存到本地文件,但是查找比较麻烦,所以就有了数据库,主要是方便查找数据,增删改查等操作,而 SqLite 属于数据库中轻量级的存在,适合本地数据存储功能。

2.开发需求

        Qt 界面上管理数据多个表的数据增删改查。

3.开发环境

        Window10 + Qt5.12.2 + QtCreator4.8.2

4.实现步骤

4.1 添加 SQL

        xxx.pro 文件添加 sql 模块

QT       += sql

4.2 软件编码

          主要头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QTextEdit>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEtypedef struct
{quint32 num;QString name;QString data;}ItemData_t;class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:private:Ui::MainWindow *ui;QSqlDatabase db;bool connectSQLite(QString name = "test.db");   // 连接数据库void disconnectSQLite(void);                    // 断开数据库bool addSQLiteForm(QString name);               // 增加表bool delSqLiteForm(QString name);               // 删除表void refreshFormShow(void);                     // 刷新表显示bool checkSQLiteItemExists(QString formName, quint32 num);bool addSQLiteItem(QString formName, const ItemData_t &item);           // 添加字段bool findSQLiteItem(QString formName, QString name, ItemData_t &item);  // 通过名字查找bool querySQLiteForm(QString formName);                                 // 查找整个数据表bool modifSQLiteItem(QString formName, QString name, QString dataNew);  // 修改数据库数据bool deleteSQLiteItem(QString formName, quint32 num);                   // 删除数据库字段
};#endif // MAINWINDOW_H

        主要源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QDebug>
#include <QInputDialog>
#include <QMessageBox>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);/* 连接信号和槽 */connect(ui->pushButton_Open, &QPushButton::clicked, [this](){if (db.isOpen()){QMessageBox::information(this, "提示", "数据库已打开");return;}connectSQLite();});connect(ui->pushButton_AddForm, &QPushButton::clicked, [this](){QString formName = QInputDialog::getText(this, "输入", "请输入表名");addSQLiteForm(formName);});connect(ui->pushButton_DelForm, &QPushButton::clicked, [this](){QString formName = ui->comboBox_Form->currentText();if (formName == nullptr){QMessageBox::information(this, "提示", "数据表空");return;}delSqLiteForm(formName);});connect(ui->pushButton_Query, &QPushButton::clicked, [this](){if (!db.isOpen()){QMessageBox::information(this, "提示", "数据库未打开");return;}QString formName = ui->comboBox_Form->currentText();querySQLiteForm(formName);});connect(ui->pushButton_Insert, &QPushButton::clicked, [this](){if (!db.isOpen()){QMessageBox::information(this, "提示", "数据库未打开");return;}/* 添加数据 */QString formName = ui->comboBox_Form->currentText();ItemData_t item;item.num = ui->lineEdit_Number->text().toUInt();item.name = ui->lineEdit_Name->text();item.data = ui->lineEdit_Data->text();addSQLiteItem(formName, item);});connect(ui->pushButton_Find, &QPushButton::clicked, [this](){QString formName = ui->comboBox_Form->currentText();ItemData_t item;item.name = ui->lineEdit_Name->text();findSQLiteItem(formName, item.name, item);});connect(ui->pushButton_Modif, &QPushButton::clicked, [this](){QString formName = ui->comboBox_Form->currentText();QString name = ui->lineEdit_Name->text();QString dataNew = ui->lineEdit_Data->text();modifSQLiteItem(formName, name, dataNew);});connect(ui->pushButton_delete, &QPushButton::clicked, [this](){QString formName = ui->comboBox_Form->currentText();quint32 num = ui->lineEdit_Number->text().toUInt();deleteSQLiteItem(formName, num);});/* 打开即连接 */connectSQLite();
}MainWindow::~MainWindow()
{disconnectSQLite();delete ui;
}/* 连接数据库 */
bool MainWindow::connectSQLite(QString name)
{/* 创建 SQLITE 数据库连接 */db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName(name);/* 打开数据库 */if (!db.open()){QMessageBox::critical(this, "Database Error", db.lastError().text());return false;}/* 刷新表格显示 */refreshFormShow();/* 返回成功 */return true;
}/* 断开数据库连接 */
void MainWindow::disconnectSQLite(void)
{/* 关闭数据库连接 */if (db.isOpen()){db.close();}
}/* 添加数据表 */
bool MainWindow::addSQLiteForm(QString name)
{if (!db.isOpen()){return false;}QString createTableQuery = QString("CREATE TABLE IF NOT EXISTS %1 (id INTEGER PRIMARY KEY, num INTEGER, name TEXT, data TEXT)").arg(name);QSqlQuery query;if (!query.exec(createTableQuery)){return false;}/* 创建成功 刷新显示 */refreshFormShow();return true;
}/* 删除表 */
bool MainWindow::delSqLiteForm(QString name)
{if (!db.isOpen()){return false;}QSqlQuery query;QString deleteTableQuery = QString("DROP TABLE IF EXISTS %1").arg(name);if (!query.exec(deleteTableQuery)){return false;}refreshFormShow();return true;
}/* 刷新表显示 */
void MainWindow::refreshFormShow(void)
{/* 查询数据库所有表 */QSqlQuery query;if (!query.exec("SELECT name FROM sqlite_master WHERE type='table';")){return;}/* 显示存在的表 */ui->comboBox_Form->clear();while (query.next()){QString tableName = query.value(0).toString();ui->comboBox_Form->addItem(tableName);}
}/* 查找是否存在 */
bool MainWindow::checkSQLiteItemExists(QString formName, quint32 num)
{QString checkQuery = QString("SELECT COUNT(*) FROM %1 WHERE num = :num").arg(formName);QSqlQuery query;if (!query.prepare(checkQuery)){return false;}query.bindValue(":num", num);if (query.exec() && query.next()){int count = query.value(0).toInt();if (count > 0){return true;}}return false;
}/* 添加数据 */
bool MainWindow::addSQLiteItem(QString formName, const ItemData_t &item)
{if (checkSQLiteItemExists(formName, item.num)){return false;}/* 选择数据表 */QString insertDataQuery = QString("INSERT INTO %1 (num, name, data) VALUES (:num, :name, :data)").arg(formName);QSqlQuery query;if (!query.prepare(insertDataQuery)){return false;}query.bindValue(":num", item.num);query.bindValue(":name", item.name);query.bindValue(":data", item.data);if (!query.exec()){return false;}ui->lineEdit_Number->clear();ui->lineEdit_Name->clear();ui->lineEdit_Data->clear();return true;
}/* 获取数据 数据 */
bool MainWindow::findSQLiteItem(QString formName, QString name, ItemData_t &item)
{if (!db.isOpen()){return false;}QString findDataQuery = QString("SELECT * FROM %1 WHERE name = :name").arg(formName);QSqlQuery query;if (!query.prepare(findDataQuery)){return false;}query.bindValue(":name", name);if (!query.exec()){return false;}QString result;while (query.next()){result += QString("ID: %1, Num: %2, Name: %3, Data: %4\n").arg(query.value(0).toInt()).arg(query.value(1).toInt()).arg(query.value(2).toString()).arg(query.value(3).toString());}ui->textEdit_Query->setText(result);return true;
}/* 显示数据库数据 */
bool MainWindow::querySQLiteForm(QString formName)
{if (!db.isOpen()){return false;}/* 选择表 */QString queryDataQuery = QString("SELECT * FROM %1").arg(formName);QSqlQuery query;if (!query.exec(queryDataQuery)){return false;}QString result;while (query.next()){result += QString("ID: %1, Num: %2, Name: %3, Data: %4\n").arg(query.value(0).toInt()).arg(query.value(1).toInt()).arg(query.value(2).toString()).arg(query.value(3).toString());}ui->textEdit_Query->setText(result);return true;
}/* 修改数据 */
bool MainWindow::modifSQLiteItem(QString formName, QString name, QString dataNew)
{if (!db.isOpen()){return false;}QString updateDataQuery = QString("UPDATE %1 SET data = :newData WHERE name = :name").arg(formName);QSqlQuery query;if (!query.prepare(updateDataQuery)){return false;}query.bindValue(":newData", dataNew);query.bindValue(":name", name);if (!query.exec()){return false;}return true;
}/* 通过编号删除数据 */
bool MainWindow::deleteSQLiteItem(QString formName, quint32 num)
{if (!db.isOpen()){return false;}QString updateDataQuery = QString("DELETE FROM %1 WHERE num = :num").arg(formName);QSqlQuery query;if (!query.prepare(updateDataQuery)){return false;}// 执行查询query.bindValue(":num", num);if (!query.exec()){return false;}return true;
}

4.3 运行测试

        可以实现基本的增删改查,还可以,数据库的操作需要熟悉数据库语句

4.4 第三方工具 HeidiSQL

        主要是可以查看数据库的实际情况,使用方法如下,可以看到写入的字段

相关文章:

Qt 数据库SQLite 使用【01】基本功能

1.开发背景 Qt 开发过程中难免需要存储数据&#xff0c;可以选择保存到本地文件&#xff0c;但是查找比较麻烦&#xff0c;所以就有了数据库&#xff0c;主要是方便查找数据&#xff0c;增删改查等操作&#xff0c;而 SqLite 属于数据库中轻量级的存在&#xff0c;适合本地数据…...

stm32小白成长为高手的学习步骤和方法

我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解&#xff0c;请立即阅读STM32的文档&#xff0c;以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程&#xff0c;初学者可以看看&#xff0c;讲的真心不错。 英文好的同学&#xf…...

大模型产品Deepseek(五)、本地安装部署(Docker方式)

DeepSeek 本地部署指南 DeepSeek是一款高效的智能搜索与推荐引擎,除了通过云端API提供服务外,它还支持本地部署,让开发者可以完全控制数据和计算资源。通过本地部署,您可以将DeepSeek集成到内部系统中,在私有环境下运行模型,减少对外部API的依赖,同时提升数据隐私性与响…...

Kafka 的消费offset原来是使用ZK管理,现在新版本是怎么管理的?

目录 基于 ZooKeeper 管理消费 offset 原理 缺点 新版本基于内部主题管理消费 offset 原理 优点 示例代码(Java) 在 Kafka 早期版本中,消费者的消费偏移量(offset)是存储在 ZooKeeper 中的,但由于 ZooKeeper 并不适合高频读写操作,从 Kafka 0.9 版本开始,消费偏…...

基于改进型灰狼优化算法(GWO)的无人机路径规划

内容&#xff1a; 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法&#xff0c;模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性&#xff0c;比如容易陷入局部最优&#xff0c;收敛速度慢等&#xff0c;所以改进型的GWO可能通过不同的策略来优化这些…...

JS中|=是什么意思?

在JavaScript中&#xff0c;| 是一个位运算符的复合赋值操作&#xff0c;具体表示按位或赋值运算。这个操作符会对两个操作数进行按位或&#xff08;|&#xff09;运算&#xff0c;然后将结果赋值回左操作数。 let a 5; // 二进制表示为 0101let b 3; // 二进制表示为 0011a …...

快速上手Vim的使用

Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式&#xff08;ctrlV进入&#xff09; Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑&#xff0c;甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…...

RPA与深度学习结合

什么是RPA RPA即机器人流程自动化&#xff08;Robotic Process Automation&#xff09;&#xff0c;它是一种利用软件机器人模拟人类在计算机上的操作&#xff0c;按照预设的规则自动执行一系列重复性、规律性任务的技术。这些任务可以包括数据录入、文件处理、报表生成、系统…...

在阿里云ECS上一键部署DeepSeek-R1

DeepSeek-R1 是一款开源模型&#xff0c;也提供了 API(接口)调用方式。据 DeepSeek介绍&#xff0c;DeepSeek-R1 后训练阶段大规模使用了强化学习技术&#xff0c;在只有极少标注数据的情况下提升了模型推理能力&#xff0c;该模型性能对标 OpenAl o1 正式版。DeepSeek-R1 推出…...

长安汽车发布“北斗天枢2.0”计划,深蓝汽车普及全民智驾

2月9日&#xff0c;长安汽车智能化战略“北斗天枢2.0”计划暨深蓝汽车全场景智能驾驶解决方案发布会在重庆盛大召开。此次发布会标志着长安汽车正式迈入智能化战略的新纪元&#xff0c;携手众多“中国智驾合伙人”&#xff0c;共同开启全民智驾元年。 发布会上&#xff0c;长安…...

Aitken 逐次线性插值

Aitken 逐次线性插值 用 Lagrange 插值多项式 L n ( x ) L_n(x) Ln​(x)计算函数近似值时&#xff0c;如需增加插值节点&#xff0c;那么原来算出的数据均不能利用&#xff0c;必须重新计算。为克服这个缺点&#xff0c;可用逐次线性插值方法求得高次插值。 令 I i 1 , i 2…...

docker 安装 Prometheus、Node Exporter 和 Grafana

Docker Compose 配置文件 docker-compose.yml services:prometheus:image: prom/prometheus:latestcontainer_name: prometheusvolumes:- ./prometheus.yml:/etc/prometheus/prometheus.yml # 挂载配置文件 - prometheus_data:/prometheus # 持久化数据存储 command:- --…...

【LeetCode 热题100】74:搜索二维矩阵(二分、线性两种方式 详细解析)(Go 语言实现)

&#x1f680; 力扣热题 74&#xff1a;搜索二维矩阵&#xff08;详细解析&#xff09; &#x1f4cc; 题目描述 力扣 74. 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵 matrix &#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的…...

元数据、数据元、数据元素、数据项 和 主数据的概念

一、元数据 1.概念 元数据&#xff0c;又称中介数据、中继数据&#xff0c;为描述数据的数据。主要是描述数据属性的信息&#xff0c;用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。 2.实例 数据库中&#xff0c;表的名称、表字段名、其他相关的描述信息&a…...

阿里云cdn怎样设置图片压缩

阿里云 CDN 提供了图像加速服务&#xff0c;其中包括图像压缩功能。通过设置图片压缩&#xff0c;可以显著减小图片文件的体积&#xff0c;提升网站加载速度&#xff0c;同时减少带宽消耗。九河云来告诉你如何进行图片压缩吧。 如何设置阿里云 CDN 图片压缩&#xff1f; 1. 登…...

白话文实战Nacos(保姆级教程)

前言 上一篇博客 我们创建好了微服务项目,本篇博客来体验一下Nacos作为注册中心和配置中心的功能。 注册中心 如果我们启动了一个Nacos注册中心,那么微服务比如订单服务,启动后就可以连上注册中心把自己注册上去,这过程就是服务注册。每个微服务,比如商品服务都应该注册…...

7. 基于DeepSeek和智谱清言实现RAG问答

课件链接&#xff1a;https://cloud.189.cn/t/VNvmyimY7Vna&#xff08;访问码&#xff1a;e4cb&#xff09;天翼云盘是中国电信推出的云存储服务&#xff0c;为用户提供跨平台的文件存储、备份、同步及分享服务&#xff0c;是国内领先的免费网盘&#xff0c;安全、可靠、稳定、…...

【数据结构】双向链表(真正的零基础)

链表是一种物理存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过指针的链接来实现的&#xff01;在上篇我们学习了单向链表&#xff0c;而单向链表虽然空间利用率高&#xff0c;插入和删除也只需改变指针就可以达到&#xff01;但是我们在每次查找、删除、访问..…...

【生产变更】- Oracle RAC添加配置ipv6地址

【生产变更】- Oracle RAC添加配置ipv6地址 一、概述二、环境检查及备份2.1 检查并备份系统层面IP配置2.2 检查并备份监听配置2.3 检查并备份网卡配置2.4 检查并备份/etc/hosts三、集群层面配置3.1 检查集群配置3.2 停止集群组件3.3 Bond0网卡设置3.4 /etc/hosts文件配置3.5 重…...

Ai无限免费生成高质量ppt教程(deepseek+kimi)

第一步&#xff1a;打开deepseek官网&#xff08;DeepSeek) 1.如果deepseek官网网络繁忙&#xff0c;解决方案如下&#xff1a; (1)使用easychat官网&#xff08;EasyChat&#xff09;使用deepseek模型&#xff0c;如图所示&#xff1a; &#xff08;2&#xff09;本地部署&…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...