42.QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解
qt 提供了 qtsql 模块来提供平*立的基于 sql 的数据库操作。这里我们所说的“平台
独立”,既包括操作系统平台,也包括各个数据库平台,qt支持以下几种数据库:
- qt自带sqlite数据库,不需要再安装
- qtds在qt4.7起已经被移除
1.qtsql
要使用qtsql 模块的话,需要在.pro文件中添加这么一句:
qt += sql
2.qsqldatabase
qsqldatabase类提供了一个接口,用于通过连接访问数据。qsqldatabase的一个实例表示连接。该连接通过受支持的数据库驱动程序之一提供对数据库的访问,该驱动程序派生自qsqldriver。
2.1 创建一个数据库示例如下
qsqldatabase db = qsqldatabase::adddatabase("qsqlite"); db.setdatabasename("scooters.dat"); //如果本目录下没有该文件,则会在本目录下生成,否则连接该文件 if (!db.open()) { qmessagebox::warning(0, qobject::tr("database error"), db.lasterror().text()); return false; }
编译运行后,可以看到已经创建了该文件:
创建成功后,该文件默认为空的,然后就可以使用qsqlquery类来操作该数据库, qsqlquery类使用的是sql语句,如果只需要使用高层次的数据
库接口(不关心 sql 语法),我们可以选择 qsqltablemodel 和
qsqlrelationaltablemodel(在后续章节介绍)。本章我们介绍
qsqlquery 类,来如何使用sql语法.
3.qsqlquery类介绍
通过exec()成员函数来执行dml(数据操作语言)语句,如select、insert、update和delete,以及ddl(数据定义语言)语句等.
比如:
qsqlquery query; query.exec("drop table students"); //删除名为students的表
4.接下来,我们讲讲如何导入数据
创建表:
query.exec("create table students (" "id integer primary key autoincrement, " "name varchar(40) not null, " " score integer not null, " "class varchar(40) not null)"); //创建一个students表,标题分别为id、name、score、class
" primary key autoincrement,":表示该列为整数递增,如果为空时则自动填入1,然后在下面的每一行都会自动+1, primary key则表示该列作为列表的主键,通过它可以轻易地获取某一行数据
" integer ":表示该列为带符号的整数
" varchar(40) ":表示该列为可变长字符串,默认只能存储英文和数字或者utf-8,最多存储40个字节.
"not null ":表示该列的内容不为空
导入数据:
query.exec("insert into students (name, score,class) " "values ('小张', 85, '初2-1班')"); //向students表里的(name, score,class)标题下插入一项数据'小张', 85, '初2-1班'
添加后如下图所示:
5.批量导入库
如果我们有大串数据需要导入时,也可以使用prepare()来绑值,然后再通过bindvalue()向绑值加入数据
示例代码如下所示:
qstringlist names; names<<"小a"<<"小b"<<"小c"<<"小d"<<"小e"<<"小f"<<"小g" <<"小h"<<"小i"<<"小g"<<"小k"<<"小l"<<"小m"<<"小n"; qstringlist clases; clases<<"初1-1班"<<"初1-2班"<<"初1-3班"<<"初2-1班" <<"初2-2班"<<"初2-3班"<<"初3-1班"<<"初3-2班"<<"初3-3班"; qsqldatabase db = qsqldatabase::adddatabase("qsqlite"); db.setdatabasename("students.dat"); //在本目录下生成 qsqlquery query; query.exec("drop table students"); //先清空一下表 query.exec("create table students (" "id integer primary key autoincrement, " "name varchar(40) not null, " " score integer not null, " "class varchar(40) not null)"); //创建一个students表 query.prepare("insert into students (name, score,class) " "values (:name, :score, :class)"); //为每一列标题添加绑定值 foreach (qstring name, names) //从names表里获取每个名字 { query.bindvalue(":name", name); //向绑定值里加入名字 query.bindvalue(":score", (qrand() % 101)); //成绩 query.bindvalue(":class", clases[qrand()%clases.length()] ); //班级 query.exec(); //加入库中 }
运行后,通过sqlite工具打开students.dat,如下图所示:
6.查询表内容
我们对上图生成的students.dat文件进行查询内容时,则需要使用where 关键字实现.
示例-查询成绩值为60~80之间的学生:
query.exec("select * from students where score >= 60 and score <= 80;"); while(query.next()) { qstring id = query.value(0).tostring(); qstring name = query.value(1).tostring(); qstring score = query.value(2).tostring(); qstring classs = query.value(3).tostring(); qdebug()<<id<<name<<score<<classs; }
运行打印:
当然还有其它语句,比如:
"select * from students where score >= 80 or class == '初3-3班';" //判断成绩大于等于80,或者班级为初3-3班的
打印如下图所示:
"select * from students where class glob '*3-3*';" // glob表示通配符,匹配班级带有"3-3"的名字
打印如下图所示:
ps:如果想查询所有内容,则改为 query.exec("select * from students ");
7.删表内容
删表内容有3个语句:
- drop: 用来删除整表,并且连表结构也会删除,删除后则只能使用create table来重新创建表
- truncate: 在sqlite中没有该语句,在mysql中有该语句,用来清楚表内数据,但是表结构不会删除.
- delete: 删除部分记录,并且表结构不会删除,删除的速度比上面两个语句慢,可以配合where来删除指定的某行
示例1
query.exec("delete from students"); //删除students表里所有内容
删除后如下图所示:
示例2-删除id=3的一行
query.exec("delete from students where id = 3");
删除前:
删除后:
8.改表内容
改表内容一般用下面两个语句:
- update : 用来修改表中内容,可以通过where语句来指定修改
- alter table: 用来重命名表,或者在已有的表中添加新的一列
8.1 alter 示例
示例1
query.exec("alter table students rename to new_students"); //将students重命名为new_students
运行后如下图所示:
示例2
query.exec("alter table new_students add column 结果 varchar(10)"); //向 new_students表里添加新的一列,标题为结果,内容格式为varchar
运行后如下图所示:
8.2 update 示例
示例1-不使用where,直接修改某列
query.exec("update new_students set score = 100 , name = '小a'"); //修改score和name所在的列内容
修改后如下图所示:
示例2-使用where,判断小于60的设为不合格,否则设为合格
query.exec("update new_students set 结果='不合格' where score<60 "); query.exec("update new_students set 结果='合格' where score>=60 ");
修改前如下图所示:
修改后:
上一篇: 安全保本又能冲击高回报理财产品
推荐阅读
-
C#操作SQLite数据库方法小结(创建,连接,插入,查询,删除等)
-
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
-
42.QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解
-
手把手教你使用C#操作数据库SQLite,创建数据库,创建表,插入,查询,删除(持续更新)
-
手把手教你使用C#连接并操作数据库SQLite,创建数据库,创建表,插入INSERT,查询SELECT,删除DELETE(持续更新)
-
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子_PHP教程
-
Laravel之DB类操作数据库(创建表、添加字段、创建控制器、添加数据、修改数据、删除数据、显示查询数据、返回ID的方法getId)
-
C#操作SQLite数据库方法小结(创建,连接,插入,查询,删除等)
-
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子_php实例
-
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子