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数据容量,而且性能仅受限于系统的可用内存,没有其他依赖,可以应用于多种操作系统平台。
SQLite可视化管理工具(SQLite Expert Pro)
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语句
//! 单条导入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"属性所在列的编号,列从左向右编号,最左边的编号为0int 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的记录,即第三条记录,因为第一条记录的编号为0qDebug() << "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
参考资料:
1. SQlite在已创建的表中删除一列
2.42.QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解
Qt学习笔记之SQLITE数据库相关推荐
- Qt学习笔记之MySQL数据库
一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...
- Qt学习笔记之数据库
一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...
- Qt学习笔记,Qt国际化
Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\ ...
- Qt学习笔记,Qt程序架构设计要旨
Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...
- oracle查询当前归档scn_【学习笔记】Oracle数据库 查看归档日志存放的位置
[学习笔记]Oracle数据库 查看归档日志存放的位置 时间:2016-10-21 19:19 来源:Oracle研究中心 作者:HTZ 点击: 次 天萃荷净 分享一篇关于查看Oracle ...
- MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- MySQL学习笔记03【数据库表的CRUD操作、数据库表中记录的基本操作、客户端图形化界面工具SQLyog】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- MySQL学习笔记01【数据库概念、MySQL安装与使用】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- Qt学习笔记之文件处理
Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储.对文件信息和目录进行操作的类是QfileIn ...
最新文章
- 图片Alpha预乘的作用[转]
- SQL Server 备份与恢复之四:备份类型和选项
- Netweaver工作进程的内存限制 VS CloudFoundry应用的内存限制
- 解决 MyEclipse build workspace 慢,validation javascript 更慢的问题
- hibernate常见错误汇总
- 计算机专业三年级的学生英语,计算机专业英语 计算机专业英语对照表.doc
- AT指令集及其通信测试方式
- Learning to Fuse Asymmetric Feature Maps in Siamese Trackers 论文与代码笔记
- 迪克斯特拉(Dijkstra)算法之MATLAB实现
- mysql入门 ,及详细步骤
- 互联网金融项目数据分析
- ARM SMMU的原理与IOMMU[转载]
- Hadoop-HDFS
- HR看到个华为 21级程序员的简历,月薪27w,那是什么概念!
- C# 调用钉钉接口进行发送企业通知消息,适应于网页版
- 如何在网页中生成PDF
- D3.js实现力导向图(Dray和Zoom)
- iOS14越狱Unv0ver6.0.0工具已签名!附在线安装地址!
- 迈克菲详解Android.FakeInstaller恶意伪装程序
- 使用React Native构建类似Tinder的加载器
热门文章
- Boost.SmartPtr 的快速 (CI) 测试
- boost::mp11::mp_filter相关用法的测试程序
- boost::fusion::make_fused_procedure用法的测试程序
- boost::coroutine2模块实现layout的测试程序
- boost::coroutine模块实现相同的边缘的测试程序
- GDCM:gdcm::Fragment的测试程序
- boost::core::is_same用法测试实例
- Boost:bind绑定转发2个参数的测试
- VTK:Points之UnsignedDistance
- VTK:图表之CreateTree