软件设计开发笔记4:QT操作SQLite数据库

news2024/12/25 9:59:09

  有时候我们需要在软件中记录一些历史数据以便于对数据的查询。而我们希望软件不能太复杂,体量也不要太大,这个时候就需要如SQLite这样轻量级的数据库。这篇中我们就来讨论如何在使用QT开发应用是操作SQLite数据库。

0、概述

  SQLite是一款开源、轻量级、跨平台的数据库,无需Server,无需安装和管理配置。它的设计目标是嵌入式的,所以很适合小型应用,也是Qt应用开发种常用的一种数据库。
  我们先设计一个简单的操作界面,最上面一行是六个操作按钮,分别实现数据库的连接、表格创建、数据查询,插入数据、修改数据以及删除数据。中间文纸是两个输入框,分别是输入姓名和年龄。最下面是一个图标显示。具体形式如下:

  在开发之前,如果我们使用QtCreator则需要在*.pro中引入sql模块(QT+=sql),如果是VS中在Qt VS Tool里勾选上sql模块,就可以使用该模块的接口了。

1、连接数据库

  QSqlDatabase类提供了一个接口,用于通过连接访问数据。SQLite在单个文件上运行,在打开连接时必须将其设置为数据库名称。如果该文件不存在,SQLite将尝试创建它。
  我们实现一个连接数据库的函数,并在“连接数据库”按钮的槽函数中调用它来实现数据库的连接。具体的代码如下:

void MainWindow::ConnectDatabase()
{
    if(QSqlDatabase::contains("qt_sql_default_connection"))
    {
        db = QSqlDatabase::database("qt_sql_default_connection");\
    }
    else
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
    }

    db.setDatabaseName("DBTest.db");
}

  在上述代码中,我们连接一个名称为“DBTest.db”的数据库,但这个数据库一开始是没有的,所以运行这段代码后会创建一个名为“DBTest.db”的数据库。运行完成后我们使用SQLiteStudio查看,发现已经创建了一个名为“DBTest.db”的数据库,并可一连接上。如下图:

2、创建数据表

  接下来,我们创建一个数据表。其中QSqlQuery类可以使用SQL语句来实现与数据库交互。所以在这里我们使用该类操作SQL语句穿件一个数据表。在这里我们创建一个名为staff的表格,该表中包括3个字段:id字段作为主键并自动增长;name字段和age字段用于存储信息。具体代码如下:

void MainWindow::CreateTable()
{
    const QString sql="CREATE TABLE IF NOT EXISTS staff (id   INTEGER   PRIMARY KEY AUTOINCREMENT NOT NULL,name CHAR (50) UNIQUE NOT NULL,age  INTEGER)";

    //QSqlQuery构造前,需要db已打开并连接
    //未指定db或者db无效时使用默认连接进行操作
    QSqlQuery query;

    if(query.exec(sql))
    {
        qDebug()<<"init table success";
    }
    else
    {
        //打印sql语句错误信息
        qDebug()<<"init table error";
    }
}

  运行完成创建表格命令后,我们使用SQLiteStudio查看数据的内容。连接数据库可以看到staff表格以及包含的3个字段,说明创建成功,具体如下图:

  关于QSqlQuery类,他是封装在QSqlDatabase上,用以执行SQL查询中创建,导航和检索数据所涉及的功能。它可以被用来执行DML(数据操纵语言)语句,例如select、insert、update、delete,以及DDL(数据定义语言)语句,如create table。在后续的增、删、改、查等操作中也是使用该类。

3、添加数据

  我们已经创建了表格,接下来我们尝试向表格中添加数据。在这里我们使用QSqlQuery类中的prepare()方法来预设SQL语句,然后再通过bindValue()方法加入数据。具体实现代码如下:

void MainWindow::InsertData()
{
    QSqlQuery query;
    query.prepare("INSERT INTO staff (name,age) VALUES (:name,:age)");
    query.bindValue(":name", ui->lineEditName->text());
    query.bindValue(":age", ui->lineEditAge->text());
    query.exec();
}

  我们在操作界面中添加3条记录,分别在姓名框和年龄框中输入名字和年龄点击“插入数据”按钮实现对数据的插入。完成后显示如下:

4、修改数据

  接下来我们尝试对表中的数据进行修改。我们依然使用QSqlQuery类中的prepare()方法来预设SQL语句,然后再通过bindValue()方法加入数据。具体实现代码如下:

void MainWindow::UpdateData()
{
    QSqlQuery query;

    query.prepare("UPDATE staff SET age=:age WHERE name=:name");
    query.bindValue(":name",ui->lineEditName->text());//通过自定义的别名来替代
    query.bindValue(":age",ui->lineEditAge->text());
    query.exec();
}

  在这里我们尝试将第条记录修改一下,我们在姓名框中输入“Rose”,在年龄框中输入“31”,将Rose的年龄有28修改为31。输入完成点击“修改数据”按钮,结果如下:

5、删除数据

  接下来我们尝试删除数据。我们依然使用QSqlQuery类中的prepare()方法来预设SQL语句,然后再通过bindValue()方法加入数据。我们实现根据姓名来删除数据,具体实现代码如下:

void MainWindow::DeleteData()
{
    QSqlQuery query;
    query.prepare("DELETE FROM staff WHERE name=?");
    query.addBindValue(ui->lineEditName->text());
    query.exec();
}

  我们删除第3条数据,我们在姓名框中输入“Rose”,然后点击“删除数据”按钮,得到结果如下:

6、查询数据

  最后我们来实现数据的查询问题。依然是使用QSqlQuery类,我们在这里使用查询表格全部内容的方式。具体的实现代码如下:

void MainWindow::QueryData()
{
    ui->tableWidget->clear();
    QStringList header;
    header<<"id"<<"name"<<"age";
    ui->tableWidget->setHorizontalHeaderLabels(header);

    int i=0;

    QSqlQuery query("SELECT * FROM staff");
    while (query.next())
    {
        ui->tableWidget->setItem(i,0,new QTableWidgetItem(query.value(0).toString()));
        ui->tableWidget->setItem(i,1,new QTableWidgetItem(query.value(1).toString()));
        ui->tableWidget->setItem(i,2,new QTableWidgetItem(query.value(2).toString()));
        i++;
    }
}

  我们现在删除后的表格中添加2条数据。分别是姓名“Rose”年龄“33”和姓名“Jake”年龄“45”两条数据。然后重新连接数据库并点击“查询数据”按钮,得到如下结果:

  同时我们也可以使用SQLiteStudio直接产看数据库的内容,具体如下:

  两种方式查询到的结果是一样的,说明我们的操作是正确的。

7、小结

  在这一篇中我们尝试了使用QT操作SQLite数据库,增、删、改、查以及创建等都可很好的实现。

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot原理-自动配置-原理分析-@Conditional

前言 在自动配置类中声明Bean的时候&#xff0c;除了在方法上添加Bean注解&#xff0c;还会加上Conditionalxxx的注解&#xff08;该注解都是条件装配的注解&#xff09; Conditional 作用&#xff1a;按照一定的条件进行判断&#xff0c;在满足给定条件后才会注册对应的bea…

CSP 202203-1 未初始化警告

答题 要注意是xi和yi的范围&#xff0c;yi可以是0为常数。 #include<iostream> using namespace std;int main() {int n,k;cin>>n>>k;bool*initializenew bool[n]{false};int result0,x,y;while(k--){cin>>x>>y;if(y&&!initialize[y-1…

E. Hanging Hearts

Problem - E - Codeforces 思路&#xff1a;我们考虑用树形dp&#xff0c;用f[i][0]表示以i为根&#xff0c;并且当前节点不在最长上升子序列中&#xff0c;用f[i][1]表示以i为根&#xff0c;当前节点在最长上升子序列中&#xff0c;那么f[i][0]max(f[j][0],f[j][1])&#xff0…

4年经验来面试20K的测试岗,连基础都不会,还不如招应届生!

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。 看简历很多都是3、4年工作经验&#xf…

使用Python 进行分析

在当今竞争激烈的互联网时代&#xff0c;对于网站的SEO优化至关重要。本文将介绍一种强大的秘密武器&#xff1a;使用Python 进行竞争对手网站分析。通过这种技术&#xff0c;您可以深入了解竞争对手的网站结构、关键词排名和优化策略&#xff0c;为您的SEO优化工作提供有力支持…

网络原理

网络原理 传输层 UDP 特点 特点&#xff1a;无连接&#xff0c;不可靠&#xff0c;面向数据报&#xff0c;全双工 格式 怎么进行校验呢&#xff1f; 把UDP数据报中的源端口&#xff0c;目的端口&#xff0c;UDP报文长度的每个字节&#xff0c;都依次进行累加 把累加结果&a…

跨境电商产业链,服务商的“霸道”你见识过吗?(测评补单)

跨境电商行业的服务商众多&#xff0c;涉及到从前期培训和店铺注册准备到中期选品软件、营销服务、流量投放和支付等多个环节。然而&#xff0c;行业乱象也日益严重&#xff0c;出现了一些不良现象&#xff0c;如恶意竞争、高价要求、割韭菜等。 卖家在选择服务商时应谨慎&…

自适应t分布变异的黏菌优化算法,MATLAB代码

本期为大家带来的是&#xff1a;自适应t分布变异的黏菌优化算法。分别在CEC2005,CEC2017,CEC2021和CEC2022上进行测试&#xff0c;自适应t分布变异的黏菌优化算法(DTSMA)均有非常不错的表现&#xff01;大家可以将此文章中提到的改进策略用于别的智能算法的改进。 参考文献&…

arduino的包含库文件定义配合vsCode查看最初定义

记录这个方式是一个意外发现 一个工程例子说明情况 这个示例工程是一个再oled显示屏上显示的arduino程序。font.h中包含的是字符和图片的取模数组&#xff0c;也就是很多点亮led阵列的数组 下面的就是16*8点阵的字模矩阵&#xff0c;矩阵的值的来历可以参考资料 使用vs cod…

nodejs下载指定版本

1.搜索nodejs打开官网nodejs官网&#xff08;除了去官网下载之外还可以使用nvm下载&#xff09; 2.点击downloads 3.往下滑点击Previous Releases(以前的版本) 4.找到你想下载的版本点开&#xff08;此处可能没你想要的具体版本&#xff0c;没关系找到大版本号相同的点开就行了…

用“居委会”实现差异化竞争,蔚来的品牌社区是怎样创造价值的?|新能源车专题研究...

主笔&#xff1a;浣芳黛 出品&#xff1a;增长黑盒研究组 增长黑盒近期开展的新能源车专题研究&#xff0c;旨在深入挖掘新势力们营销与运营的“真经”&#xff0c;上一期研究了极氪之后&#xff0c;马上有热心读者在后台求写蔚来。毋庸置疑&#xff0c;在造车新势力这条竞争日…

黑马JVM总结(二)

&#xff08;1&#xff09;栈 栈帧对应一次方法的调用&#xff0c;线程是要执行代码的&#xff0c;这些代码都是由一个个方法组成&#xff0c;线程运行的时候每个方法需要的内存叫做一个栈帧 &#xff08;2&#xff09;栈的演示 Frames&#xff1a;相当有栈 方法相当于栈帧…

大数据导论 笔记

一、大数据方向 1、技术发展 计算机网络云计算大数据时代人工智能&#xff08;本科&#xff1a;使用&#xff0c;研究生&#xff1a;推导&#xff0c;博士&#xff1a;创新&#xff09; 2023年 大数据模型 人工智能元年 2、基础课程 hadoop 大数据基础 三大件&#xff1a;HDF…

计算机网络原理 网络层

一&#xff0c;网络层的几个重要概念 1&#xff0c;网络层提供的两种服务 在计算机网络领域&#xff0c;网络层应该向运输层提供怎样的服务&#xff08;“面向连接”还是“无连接”&#xff09;引起了长期的争论。争论的焦点就是&#xff1a;在计算机通信中&#xff0c;可靠交…

Kafka3.0.0版本——消费者(RoundRobin分区分配策略以及再平衡)

目录 一、RoundRobin 分区分配策略原理二、RoundRobin分区分配策略代码案例2.1、创建带有7个分区的sixTopic主题2.3、创建三个消费者 组成 消费者组2.3、创建生产者2.4、测试2.5、RoundRobin分区分配策略代码案例说明 三、RoundRobin 分区分配再平衡案例3.1、停止某一个消费者后…

MySQL--MySQL表的增删改查(进阶)

check 聚合查找 count sum average max min 我们这里先构造出多张表 查询lisi同学的成绩 来自student和来自score c 增加名字这一条件 查询所有同学的总成绩以及个人信息 来自score和来自student 查询所有同学的各科成绩以及个人信息 来自student&#xff0c;course和…

数据分享|SAS数据挖掘EM贷款违约预测分析:逐步Logistic逻辑回归、决策树、随机森林...

全文链接&#xff1a;http://tecdat.cn/?p31745 近几年来&#xff0c;各家商业银行陆续推出多种贷款业务&#xff0c;如何识别贷款违约因素已经成为各家商业银行健康有序发展贷款业务的关键&#xff08;点击文末“阅读原文”获取完整数据&#xff09;。 相关视频 在贷款违约预…

Python开源项目周排行 2023年第33周

#2023年第33周2023年9月9日1feapder款上手简单&#xff0c;功能强大的 Python 爬虫框架&#xff0c;内置 AirSpider、Spider、TaskSpider、BatchSpider 四种爬虫解决不同场景的需求。命名源于 fast-easy-air-pro-spider 缩写。 支持断点续爬、监控报警、浏览器渲染、海量数据去…

【洛谷 P1105】平台 题解(结构体+暴力枚举)

平台 题目描述 空间中有一些平台。给出每个平台的位置&#xff0c;请你计算从每一个平台的边缘落下之后会落到哪一个平台上。注意&#xff0c;如果某两个平台的某个两边缘横坐标相同&#xff0c;物体从上面那个平台落下之后将不会落在下面那个平台上。平台可能会重叠。 如果…

使用GPU虚拟化技术搭建支持3D设计的职校学生机房(云教室)

背景 学校为职业学校&#xff0c;计算机教室需要进行Maya、Adobe Illustrator、Adobe Dreamweaver、Adobe PhotoShop等软件的教学。每个教室为35用户。资源需求为4核、8G内存、80G硬盘。 基于桌面虚拟化VDI技术的机房在成本、可管理性方面&#xff0c;相对于传统胖终端的机房…