QT6实现创建与操作sqlite数据库(一)

news2024/9/21 0:37:57

一.Qt为SQL数据库提供支持的基本模块(Qt SQL)

   Qt SQL的API分为不同层:

   驱动层

   SQL API层

   用户接口层

1.驱动层

   对于Qt 是基于C++来实现的框架,该层主要包括QSqlDriver,QSqlDriverCreator,QSqlDriverCreatorBase,QSqlPlugin,and QSqlResult.这一层提供了特定数据和SQLAPI层之间的底层桥梁。

2.SQL API层

   对于SQL API层提供了数据库的访问相关类,其中,QSqlDatabase类进行连接,QSlqQuery可以完成于数据库的交互。除此之外,包括了还提供了QSqlError,QSqlField,QSqlIndex,and QSqlRecord类。

3.用户接口层

   用户接口层的几个类实现了将数据库中的数据链连接到窗口部件上,这些类是使用模型/试图框架实现的,它们是更高层次的抽象,主要包括QSqlQueryModel,QSqlTableModel,andQSqlRelationalTableModel.

4.Qt SQL模块对数据库类

在Qt中为SQL数据库提供驱动程序层、SQL API层和用户界面,其提供主要类的简要功能说明见下表:

二.SQLite数据库操作流程

   第一步:在项目管理文件(.pro)中,增加数据库模块:QT    += sql

   第二步:查看Qt对数据库的驱动的类型的支持

   第三步:连接数据库,打开数据库

   第四步:访问数据库,读写操作

   第五步:关闭数据库

三.代码示例

1.查看Qt对数据库的驱动的类型的支持

  1. 代码

#include <QApplication>

#include <QSqlDatabase>

#include <QDebug>

#include <QStringList>

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    qDebug() << "Available drivers:";

    QStringList drivers = QSqlDatabase::drivers();

    foreach(QString driver, drivers)

        qDebug() << driver;

    return a.exec();

}

(2)执行结果

2.Qt读写Sqlite数据库

Qt访问Sqlite数据库的三种方式(即使用三种类库去访问),分别为QSqlQuery、QSqlQueryModel、QSqlTableModel,对于这三种类库,可看为一个比一个上层,也就是封装的更厉害,甚至第三种QSqlTableModel,根本就不需要开发者懂SQL语言,也能操作Sqlite数据库。

下面示例采用QSqlQuery方法实现数据库操作。

(1)widget.h

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QSqlError>

#include <QSqlQueryModel>

#include <QSqlRelationalTableModel>

#include <QSqlRelationalTableModel>

#include <QTableView>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

    Q_OBJECT

public:

    explicit Widget(QWidget *parent = nullptr);

    ~Widget();

private:

    Ui::Widget *ui;

    QSqlTableModel *model;

};

#endif // WIDGET_H

(2)widget.cpp

#include "widget.h"

#include "ui_widget.h"

#include <QSqlDatabase>

#include <QDebug>

#include <QSqlQuery>

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

{

    ui->setupUi(this);

    //1.创建与打开数据库

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("dataset.db");

    if(!db.open())

    {

        qDebug() << "创建失败   " << db.lastError();

    }

    else

    {

        qDebug() << "创建成功";

    }

    //2.创建表

    QSqlQuery sql_query;

    QString create = "create table student(id int,name varchar(20),age int)";

    sql_query.prepare(create);

    sql_query.exec();

    //32.插入数据

    QString insert_sql = "insert into student values(?,?,?)" ;

    sql_query.prepare(insert_sql);

    sql_query.addBindValue(1);

    sql_query.addBindValue("Tom");

    sql_query.addBindValue(15);

    if(!sql_query.exec())

    {

        qDebug() << "插入执行错误: " << sql_query.lastError();

    }

    else {

        qDebug() << "插入成功";

    }

    //4.读取数据库表全部内容

    QString select_sql = "select * from student";

    sql_query.prepare(select_sql);

    if(!sql_query.exec())

    {

        qDebug() << "查看执行错误: " << sql_query.lastError();

    }

    else {

        while(sql_query.next())//如果下一行数据还存在,就继续执行

        {

            int id = sql_query.value(0).toInt();//将sql里的int转换为qt里的int

            QString name = sql_query.value(1).toString();//将sql里的string转化为qt里的string

            int age = sql_query.value(2).toInt();

            qDebug() << "id " << id << "  name: " << name << "  age: " << age;

        }

    }

    //5.更新数据内容

    QString update_sql = "update student set name =:nm where id =:n";

    sql_query.prepare(update_sql);

    sql_query.bindValue(":nm","TTTs");

    sql_query.bindValue(":n", "1");

    if(!sql_query.exec())

    {

        qDebug() << "更新失败" << sql_query.lastError();

    }

    else {

        qDebug() << "更新成功";

    }

    //6.再次读取数据内容

    select_sql = "select * from student";

    sql_query.prepare(select_sql);

    if(!sql_query.exec())

    {

        qDebug() << "查看执行错误: " << sql_query.lastError();

    }

    else {

        while(sql_query.next())//如果下一行数据还存在,就继续执行

        {

            int id1 = sql_query.value(0).toInt();//将sql里的int转换为qt里的int

            QString name1 = sql_query.value(1).toString();//将sql里的string转化为qt里的string

            int age1 = sql_query.value(2).toInt();

            qDebug() << "id " << id1 << "  name: " << name1 << "  age: " << age1;

        }

    }

    //7.删除数据内容

    QString delete1_sql = "delete from student where id = 1";

   // QString delete1_sql = "delete from student";

    sql_query.prepare(delete1_sql);

    if(!sql_query.exec())

    {

        qDebug() << "删除失败";

        qDebug() << sql_query.lastError().text();

    }

    else {

        qDebug() << "删除成功";

    }

}

Widget::~Widget()

{

    delete ui;

}

(3)执行结果:

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

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

相关文章

笔记本固态硬盘损坏数据恢复两种方法 笔记本固态硬盘损坏如何恢复

大家好!今天要跟大家分享的是笔记本固态硬盘损坏数据恢复的两种方法。相信很多小伙伴都遇到过这种情况,电脑突然蓝屏或者死机,再开机后发现自己的数据不见了,这时候该怎么办呢?这可真是让人头疼。毕竟,我们的数据都在里面呢!别着急,我来给大家支招!今天就来给大家介绍…

Linux初识环境变量

&#x1f30e;环境变量【上】 文章目录&#xff1a; 环境变量 什么是环境变量 关于命令行参数 环境变量       简单了解       为什么需要环境变量       系统中其他环境变量 总结 前言&#xff1a; 环境变量是一种非常重要的概念&#xff0c;它们对于系统的…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Path)

路径绘制组件&#xff0c;根据绘制路径生成封闭的自定义形状。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Path(value?: { width?: number | string; height?: number |…

OpenResty使用Lua大全(九)实战:nginx-lua-redis实现访问频率控制

文章目录 系列文章索引一、需求背景二、设计方案1、预期结果2、nginx.conf配置3、access_by_limit_frequency.lua4、测试 系列文章索引 OpenResty使用Lua大全&#xff08;一&#xff09;Lua语法入门实战 OpenResty使用Lua大全&#xff08;二&#xff09;在OpenResty中使用Lua …

Django 反向解析路由

app2.urls.py from django.urls import path, re_path from . import viewsurlpatterns [path(index, views.index, nameindex),path(url_reverse, views.url_reverse, nameapp2_url_reverse), # 使用reverse()方法反向解析 ,name对于视图的reverse("app2_url_reverse&…

鼎阳SDS6204示波器EPICS IOC的搭建

三年前曾写过这个文&#xff1a; 鼎阳SDS6204示波器的EPICS IOC调试 文章里有EPICS网站设备IOC搭建的指南&#xff0c;具体搭建IOC的步骤就没详细写了&#xff0c;几年后重新搭建时发现还是费了些力气才搭建起来&#xff0c;因此写此文记录下手把手的过程方便自己以及EPICS的初…

阿里云云服务器ECS端口多个端口号开通教程

阿里云云服务器ECS端口多个端口号开通教程 1、登录到ECS云服务器管理控制台 2、左侧栏找到【实例与镜像】>>【实例】&#xff0c;找到目标ECS实例&#xff0c;点击实例ID进入到实例详情页 3、切换到【安全组】页面&#xff0c;点击右侧【配置规则】&#xff0c;如下图&…

Mysql与MyBatis

1 Sql语句 增删改查 1.1 建表 -- cmd展示数据库 show databases ; -- cmd登录数据库 mysql localhost -u root -p-- auto_increment 自动增长&#xff0c;每添加一个表项id自动增1 -- char定长字符串 0-255&#xff0c;不足十个字符按十个字符算&#xff0c; varchar变长字符串…

[LLM]大语言模型文本生成—解码策略(Top-k Top-p Temperature)

{"top_k": 5,"temperature": 0.8,"num_beams": 1,"top_p": 0.75,"repetition_penalty": 1.5,"max_tokens": 30000,"message": [{"content": "你好","role": "user&…

【深度学习】手动实现全连接神经网络(FCNN)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; 神经网络的本质就是通过参数、线性函数与激活函数来拟合特征与目标之间的真实函数关系。 01 神经网络简介 1.1 引入 神经网络是一门重要的机器学习技术&…

hosts文件丢失了怎么办?

hosts文件的位置&#xff1a;C:\Windows\System32\drivers\etc 丢失了恢复的方法&#xff1a; 在“管理员&#xff1a;命令提示符中输入&#xff1a; &#xff08;winR 然后cmd&#xff09; for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\d…

SAP前台处理:物料主数据创建<MM01>之采购视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…

SpringMVC | SpringMVC中的“JSON数据交互“ 和“RESTful支持“

目录: 1.JSON 数据交互1.1 JSON概述1.2 JSON的“数据结构”对象结构数组结构 1.3 JSON的“数据转换” (JSON交互) 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff01; 该文章参考学习教…

二、C#选择排序算法

简介 选择排序算法的基本思想是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列三:Faster R-CNN图文详解

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二&#xff1a;Fast R-CNN图文详解 概念预设 感受野 感受野(Receptive Field) 是指特征图上的某个点能看到的输入图像的区域。 神经元感受野的值越大表示其能接触到的原始图像范围就越大&#xff0c;也意味着它…

工业AMR机器人如何实现规模化的柔性生产

在当下高度复杂的工业生产环境中&#xff0c;机器人如何实现规模化的柔性生产&#xff0c;已成为业界关注的焦点。特别是在追求高效率、高质量的生产过程中&#xff0c;团队协作的重要性愈发凸显。富唯智能一体化AMR控制系统&#xff0c;作为机器人的核心指挥部&#xff0c;犹如…

VMware安装Centos 6.5系统

文章目录 镜像下载地址1.在vmware中新建虚拟机2.选择标准典型步骤进行安装3.选择以后再放入光盘4.选择准备安装的系统类型5.为虚拟机指定名称并指定位置6.磁盘空间20G默认下一步&#xff1b;7.将无用的硬件删除掉8.点击打开虚拟机&#xff1b;9.选择第一个回车进行全新安装&…

蓝桥杯刷题(十一)

1.卡片 反向思考&#xff0c;看k种卡片可以分给几位同学 代码 n int(input()) k 1 while k*(k1)<2*n:k1 print(k)2.美丽的2 代码 def f(x)->bool:while x:if x%102:return Truex//10return False cnt 0 for i in range(1,2021):if f(i):cnt1 print(cnt)3.单词分析 …

Pytorch详细应用基础(全)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.安装pytorch以及anaconda配置 尽量保持默认的通道&#xff0c;每次写指令把镜像地址写上就行。 defaults优先级是最低的&#…