Qt学习笔记之SQLITE数据库

1. SQLite数据库介绍
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2019年已经有19个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

Qt提供了一种进程内数据库——SQLite,它小巧灵活,无须额外安装配置且支持大部分ANSI SQL92标准,是一个轻量级的数据库,概括起来它具有以下优点:

(1)SQlite的设计目的是嵌入式SQL数据库引擎,它基于纯C语言代码,应用非常广泛。

(2)SQlite在需要持久存储时,可以直接读写硬盘上的数据文件,在无须持久存储时,也可以将整个数据库置于内存中,两者均不需要额外的server服务端进程,即SQlite是无须独立运行的数据库引擎。

(3)开放源代码,整个代码少于三万行,有良好的注释和90%以上的测试覆盖率。

(4)少于250K的内存占用(gcc编译下)。

(5)支持视图、触发器、事务,支持嵌套SQL功能。

(6)提供虚拟机用于处理SQL语句。

(7)不需要配置,不需要安装,也不需要管理员。

(8)支持大部分ANSI SQL92标准。

(9)大部分应用的速度比目前常见的客户端/服务器结构的数据库快。

10)编程接口简单易用。

在持久存储的情况下,一个完整的数据库就对应磁盘上面的一个文件,它是一种具备了基本数据库特性的数据文件,同一个数据文件可以在不同机器上面使用,可以在不同字节序的机器间自由共享,最大支持2TB数据容量,而且性能仅受限于系统的可用内存,没有其他依赖,可以应用于多种操作系统平台。

2. Qt操作SQLite数据库

2.1 创建一个数据库

 QSqlDatabase类提供了一个接口,用于通过连接访问数据。

    //! 添加数据库驱动
    QSqlDatabase mySqlLiteDB = QSqlDatabase::addDatabase("QSQLITE");
    //! 设置数据库名称
    mySqlLiteDB.setDatabaseName("E:/work/qe/mytest1/database.db");
    //! 打开数据库
    if(!mySqlLiteDB.open())
        return false;

2.2 创建一个表

QSqlQuery类可以使用SQL语句来实现与数据库交互。

    //! 以下执行相关sql语句
    QSqlQuery mySqlQuery;
    //! 清空student表
    mySqlQuery.exec("drop table student");
    //! 新建student表,id设置为主键,还有一个name项
    mySqlQuery.exec("create table student (id int primary key, name vchar,course int)");

主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。

作用:

1)保证实体的完整性;

2)加快数据库的操作速度

3) 在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。

4) DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。
 

2.3 插入数据 

2.3.1 批量插入

可以用prepare()来绑值,然后再通过bindValue()向绑值加入数据。

       //!批量导入
    QStringList strListStdName;
    strListStdName<<"wang bin"<<"xiao yu"<<"ye mei";
 
    QStringList strListStdCourse;
    strListStdCourse<<"Math"<<"English"<<"Computer";
 
    mySqlQuery.prepare("INSERT INTO student (id,name, course) "
                      "VALUES (:id,:name, :course)");
 
    for (int i = 0; i < strListStdName.size(); i++)
    {
        mySqlQuery.bindValue(":id",i);                         //! 加入主键
        mySqlQuery.bindValue(":name", strListStdName[i]);      //! 向绑定值里加入名字
        mySqlQuery.bindValue(":course", strListStdCourse[i]);  //! 课程
        mySqlQuery.exec();                                     //! 加入库中
    }
    //! 向表中插入1条数据
    mySqlQuery.bindValue(0,3);
    mySqlQuery.bindValue(1,"wang han");
    mySqlQuery.bindValue(2,"Chinese");
    mySqlQuery.exec();

  这里在student表的最后又添加了一条记录。然后我们先使用了prepare()函数,在其中利用了“:id”和“:name”来代替具体的数据,而后又利用bindValue()函数给id和name两个属性赋值,这称为绑定操作。其中编号0和1分别代表“:id”和“:name”,就是说按照prepare()函数中出现的属性从左到右编号,最左边是0 。
 

特别注意,在最后一定要执行exec()函数,所做的操作才能被真正执行。运行程序,点击查询按钮,可以看到前面添加的记录的信息。这里的“:id”“:name”,叫做占位符,这是ODBC数据库的表示方法,还有一种Oracle的表示方法就是全部用“?”号。例如:

query.prepare("insert into student(id, name) "
                  "values (?, ?)");
query.bindValue(0, 5);
query.bindValue(1, "sixth");
query.exec();

也可以利用addBindValue()函数,这样就可以省去编号,它是按顺序给属性赋值的,如下:

query.prepare("insert into student(id, name) "
                  "values (?, ?)");
query.addBindValue(5);
query.addBindValue("sixth");
query.exec();

当用ODBC的表示方法时,我们也可以将编号用实际的占位符代替,如下:

query.prepare("insert into student(id, name) "
                      "values (:id, :name)");
query.bindValue(":id", 5);
query.bindValue(":name", "sixth");
query.exec();

以上各种形式的表示方式效果是一样的。

2.3.2 用insert into语句

 
  1.  
        //! 单条导入
        mySqlQuery.exec("insert into student values(3,'wang han','Chinese')");

2.4  查询表内容 

 可以用select语句查询表内容

   //! 查找表中id >=1 的记录的id项和name项的值
    mySqlQuery.exec("select * from student where id >= 1");
 
    //! query.next()指向查找到的第一条记录,然后每次后移一条记录
    QSqlRecord mySqlRec = mySqlQuery.record();
    while(mySqlQuery.next())
    {
        //! 获取query所指向的记录在结果集中的编号
        int nRowNum = mySqlQuery.at();
        //! 获取每条记录中属性(即列)的个数
        int nColumnNum = mySqlQuery.record().count();
        //! 获取"name"属性所在列的编号,列从左向右编号,最左边的编号为0
        int nFieldNo = mySqlQuery.record().indexOf("name");
        nFieldNo     = mySqlRec.indexOf("course");
        //! 获取id属性的值,并转换为int型
        int stud_id = mySqlQuery.value(0).toInt();
        //! 获取name属性的值
        QString stud_name = mySqlQuery.value(1).toString();
        //! 获取course属性的值
        QString stud_course = mySqlQuery.value(2).toString();
        //! 输出结果
        qDebug() << nRowNum << nColumnNum << nFieldNo << stud_id << stud_name << stud_course;
    }
 
    //! 定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0
    qDebug() << "exec seek(2) :";
    if(mySqlQuery.seek(2))
    {
        qDebug() << "rowNum is : " << mySqlQuery.at()
                 << " id is : " << mySqlQuery.value(0).toInt()
                 << " name is : " << mySqlQuery.value(1).toString();
    }
    //! 定位到结果集中最后一条记录
    qDebug() << "exec last() :";
    if(mySqlQuery.last())
    {
        qDebug() << "rowNum is : " << mySqlQuery.at()
                 << " id is : " << mySqlQuery.value(0).toInt()
                 << " name is : " << mySqlQuery.value(1).toString();
    }

输出结果 

mySqlQuery.exec("select * from student where id >= 1");

查询出表中所有的内容。其中的SQL语句“select * from student”中“*”号表明查询表中记录的所有属性。而当mySqlQuery.exec("select * from student");这条语句执行完后,我们便获得了相应的执行结果,因为获得的结果可能不止一条记录,所以称之为结果集。

结果集其实就是查询到的所有记录的集合,在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。最常用的操作有:

seek(int n) :query指向结果集的第n条记录;
first() :query指向结果集的第一条记录;
last() :query指向结果集的最后一条记录;
next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录;
previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录;
record() :获得现在指向的记录;
value(int n) :获得属性的值。其中n表示你查询的第n个属性,比方上面我们使用“select * from student”就相当于“select id, name from student”,那么value(0)返回id属性的值,value(1)返回name属性的值。该函数返回QVariant类型的数据,关于该类型与其他类型的对应关系,可以在帮助中查看QVariant。
at() :获得现在query指向的记录在结果集中的编号。
需要特别注意,刚执行完mySqlQuery.exec("select *from student");这行代码时,mySqlQuery是指向结果集以外的,我们可以利用mySqlQuery.next()使得mySqlQuery指向结果集的第一条记录。当然我们也可以利用seek(0)函数或者first()函数使mySqlQuery指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在mySqlQuery.exec("select * from student");这行代码前加上mySqlQuery.setForwardOnly(true);这条代码,此后只能使用next()和seek()函数。
 

2.5 删除表内容 

2.5.1 DROP 语句        

用来删除整表,并且连表结构也会删除,删除后则只能使用CREATE TABLE来重新创建表

    //! 删除表内容
    mySqlQuery.exec("drop table student");

2.5.2 TRUNCATE语句
 在SQLite中没有该语句,在MySQL中有该语句,用来清楚表内数据,但是表结构不会删除.

2.5.3 DELETE语句      
删除部分记录,并且表结构不会删除,删除的速度比上面两个语句慢,可以配合WHERE来删除指定的某行

1) 删除整个表 
 

mySqlQuery.exec("delete table student");

 2) 删除某行

mySqlQuery.exec("delete from student where id = 1");

2.6 修改表内容 
2.6.1 update
UPDATE 语句用于更新表中已存在的记录。

SQL UPDATE 语法

UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
 

    //! 修改表内容
    mySqlQuery.exec("update student set course = 'Chinese' where id = 1");

2.6.2 alter语句 

1) 如需在表中添加列,请使用下面的语法:

ALTER TABLE table_name ADD column_name datatype

mySqlQuery.exec("alter table student add score int");

2)  如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式,该行在SQlite中不能用,SQlite不支持drop):

ALTER TABLE table_name DROP COLUMN column_name

3) 要改变表中列的数据类型,请使用下面的语法:

ALTER TABLE table_name ALTER COLUMN column_name datatype
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot(1)基础入门

SpringBoot基础入门SpringBoot项目创建方式Idea创建SpringBoot官网创建基于阿里云创建项目手工搭建SpringBoot启动parentstarter引导类内嵌tomcat基础配置属性配置配置文件分类yaml文件yaml数据读取整合第三方技术整合JUnit整合MyBatis整合Mybatis-Plus整合DruidSpringBoot是由…

运动健康路线导入,助力用户轻松导航

华为HMS Core运动健康服务支持通过REST API&#xff0c;以GPX文件格式写入用户路线数据&#xff0c;支持导入轨迹&#xff08;Track&#xff09;或路程&#xff08;Route&#xff09;类型的数据&#xff0c;实现用户路线数据在华为运动健康App中的展示效果。 假若与华为运动健…

​selenium+python做web端自动化测试框架与实例详解教程​

下面有详细的代码介绍&#xff0c;如果不是很明白的话&#xff0c;可以看看这套视频&#xff0c;在哔站学习人数超过数万人&#xff01; 在华为工作了10年的大佬出的Web自动化测试教程&#xff0c;华为现用技术教程&#xff01;_哔哩哔哩_bilibili在华为工作了10年的大佬出的W…

分享NVIDIA GTC干货_用软件引领车辆电子架构

随着软件定义功能变得更多&#xff0c;车辆电气/电子架构正在从分布式计算演变为集中式计算。通过将这台集中式超级计算机与人工智能融合在一起&#xff0c;开发模块化软件并创建数据中心基础设施。 电子架构 EEA(Electrical and Electronic Architecture) 首先介绍下EEA&am…

Ansys Zemax | 如何建模离轴抛物面镜

离轴抛物面反射镜是光学工业中一种重要的设计类型。本文演示了如何根据制造商给出的规格设计一个离轴抛物面反射镜&#xff0c;并演示如何使用主光线求解将像面中心与主光线路径对齐。(联系我们获取文章附件) 简介 离轴抛物面反射镜的优点是光束通过反射到达像面途中将不会受…

Winform控件开发(25)——TabControl(史上最全)

一、属性 1、Name 用于获取控件对象 2、AllowDrop 指示用户是否可以拖动数据到TabCotrol上 3、TabCotrol 3.1 Top 沿控件的底部放置选项卡 3.2 Left 沿控件的左边缘放置选项卡 3.3 Right 沿控件的右边缘放置选项卡 3.4 Bottom 沿控件的顶部放置选项卡 4、Anchor 锚定控件…

第18章_MySQL8其它新特性

第18章_MySQL8其它新特性 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;…

新一轮商业革命将至,张勇用“敏捷组织”率先交出答卷

一向拥抱变化的阿里再一次拥抱变化。2023年3月28日&#xff0c;阿里宣布了新的组织变革&#xff0c;这应该是迄今为止&#xff0c;阿里最重要的组织变革&#xff0c;其变革力度之大堪称前所未有。具体而言&#xff0c;阿里集团将设立云智能、淘宝天猫商业、本地生活、国际数字商…

口罩检测——环境准备(1)

文章目录前言一、工具及环境要求工具本地环境要求二、工具介绍1.labelimg2.AI Studio3.YOLO2COCO4.PaddleUtils5.paddleyolo三、库的安装总结前言 小编之前做过一期《OpenVINO-yolov5推理》&#xff0c;点开博客自动播放视频甚至有点吵&#xff0c;想过删掉&#xff0c;但是想到…

Day924.自动化测试 -系统重构实战

自动化测试 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于自动化测试的内容。 自动化测试是一个很容易产生“争议”的话题&#xff0c;也经常会有一些很有意思的问题。 自动化测试不是应该由测试同学来编写吗&#xff0c;开发是不是没有必要学吧&#xff1f;之前…

Lesson 9.1 集成学习的三大关键领域、Bagging 方法的基本思想和 RandomForestRegressor 的实现

文章目录一、 集成学习的三大关键领域二、Bagging 方法的基本思想三、RandomForestRegressor 的实现在开始学习之前&#xff0c;先导入我们需要的库&#xff0c;并查看库的版本。 import numpy as np import pandas as pd import sklearn import matplotlib as mlp import sea…

【MySQL速通篇001】5000字超详细介绍MySQL部分重要知识点

&#x1f340; 写在前面 这篇5000多字博客也花了我几天的时间&#x1f602;&#xff0c;主要是我对MySQL一部分重要知识点的理解【后面当然还会写博客补充噻&#xff0c;欢迎关注我哟】&#xff0c;当然这篇文章可能也会有不恰当的地方【毕竟也写了这么多字&#xff0c;错别字可…

Linux常用命令——ldconfig命令

在线Linux命令查询工具 ldconfig 动态链接库管理命令 补充说明 ldconfig命令的用途主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下&#xff0c;搜索出可共享的动态链接库&#xff08;格式如lib*.so*&#xff09;,进而创建出动态装入程…

python框架有哪些,常用的python框架代码

Python的应用已经相当广泛了&#xff0c;可以做很多事情&#xff0c;而 Python本身就是一个应用程序&#xff0c;我们也可以说 Python是一个高级语言。由于 Python有很多包&#xff0c;所以我们不能把所有的 Python包都了解一下&#xff0c;也不能把所有的包都读一遍&#xff0…

35岁大龄程序员职业转型规划

35岁大龄程序员职业转型规划 I. 引言 在当今快速发展的IT行业&#xff0c;程序员这个职业变得越来越重要。但是&#xff0c;对于35岁以上的程序员来说&#xff0c;面临的职业困境也越来越严峻。他们不仅面临着技术的迭代更新&#xff0c;而且还面临着市场的竞争和年轻程序员的…

碳交易机制下考虑需求响应的综合能源系统优化运行

说明书 资源链接&#xff1a;https://download.csdn.net/download/qq_50594161/87610405https://download.csdn.net/download/qq_50594161/87610405 https://download.csdn.net/download/qq_50594161/87607550https://download.csdn.net/download/qq_50594161/87607550https:…

String源码深度刨析

前言 我们将从源码角度深度分析特点&#xff0c;来提升对他们的了解以及设计。 String、StringBuilder、StringBuffer的常见面试题及四大区别可以参考&#xff1a;String、StringBuilder、StringBuffer的四大区别解析 String public final class Stringimplements java.io.Se…

在JavaScript开发中,关于var、let和const你需要知道这些

文章目录&#x1f4cb;前言&#x1f3af;var&#x1f3af;let&#x1f3af;const&#x1f3af;相关面试题&#x1f4dd;总结&#x1f4cb;前言 计算机编程中最基本的一个就是使用名字&#xff08;或标识符&#xff09;表示值。绑定名字和值为我们提供了一种引用值和在程序中使…

阿里云ECS大测评

本篇博客是阿里云 ECS实例测评&#xff0c;这里采用阿里的C5.large计算型实例 本次对云服务器ECS产品能力的体验和建议&#xff0c;可帮助其他用户选用云服务,使用云服务器ECS创建应用场景测评 首先对实例的硬件(CPU&#xff0c;内存&#xff0c;磁盘)进行测试&#xff0c;采…

数智未来·持续创新 | 易趋受邀出席DSMC 2023中国制造业数智峰会

3月17日-18日&#xff0c;以“数智未来持续创新”为主题的DSMC 2023中国制造业数智峰会在长沙成功召开。由中国通信工业协会指导&#xff0c;信息侠主办&#xff0c;湖南省数字经济促进会、浙江省数字经济联合会、安徽省首席信息官协会联合支持。鉴于易趋项目管理软件在制造行业…