Qt中使用SQLite
Qt中使用SQLite
文章目录
- Qt中使用SQLite
- 1. 概述
- 2. 数据库基本操作
- 2.1 建立数据库
- 2.2 打开数据库
- 2.3 关闭数据库
- 2.4 创建数据表
- 2.5 插入数据
- 2.6 更新/修改数据
- 2.7 查询数据——遍历查询、条件查询
- 2.7.1 遍历查询
- 2.7.2 条件查询
- 3. 条件查询与遍历查询的对比
Qt中使用SQLite
SQLite 是一款开源轻量级的数据库软件,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎,是在世界上最广泛部署的 SQL 数据库引擎,源代码不受版权限制。可以集成在其他软件中,应用十分方便。虽然是一款轻量级的数据库,但也可以满足很多应用场景。
Qt中对应数据库的模块为Qt SQL,Qt SQL模块使用数据库驱动插件来和不同的数据库接口进行通信,由于Qt SQL模块的接口是独立于数据库的,所以所有数据库特定的代码都包含在这些驱动中。
1. 概述
数据库的基本操作可以用常说的的 CRUD
来概括,即:
- C:Create增加对应
CREATE TBL ...;
- R:Retrieve查询
SELECT * from TBL;
- U:Update修改
UPDATE TBL ..SET ...;
- D:Delete删除
DELETE FROM TBL WHERE ....;
在本文中除了介绍在Qt中使用SQLite数据库的基本操作外,还会展示使用数据库储存数据后,快速查询与修改目标信息的优势
在文章示例中,关于数据库操作的类为
SqliteOperator
,数据库对象为全局变量:QSqlDatabase db;
2. 数据库基本操作
2.1 建立数据库
void SqliteOperator::CreatDb()
{if(QSqlDatabase::contains("qt_sql_default_connection")){db = QSqlDatabase::database("qt_sql_default_connection");}else{db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("test.db");db.setUserName("test");db.setPassword("test");}
}
- 建立数据库的第一步是要判断该数据库对象的连接是否已经存在,若已经存在则直接获取该对象即可。
- 每个数据库连接都存在一个连接名称,
qt_sql_default_connection
为默认连接名称,实际使用中,这个连接名称可以自己指定,指定方法为通过QSqlDatabase::addDatabase
的第二个参数指定。第一个参数中的QSQLITE
表示使用SQLite数据库。 setDatabaseName
用于指定数据库文件名setUserName
setPassword
设置用户名和密码可自定义,也可忽略
2.2 打开数据库
bool SqliteOperator::OpenDb()
{if(!db.open()){qDebug() << "Error: Failed to connect database." << db.lastError();return false;}return true;
}
2.3 关闭数据库
void SqliteOperator::CloseDb()
{db.close();
}
2.4 创建数据表
void SqliteOperator::CreateTable()
{QSqlQuery sql_query;QString creat_sql = "create table student (id int primary key, name varchar(30), age int)";sql_query.prepare(creat_sql);if(!sql_query.exec()){qDebug() << "Error: Fail to create table." << sql_query.lastError();}else{qDebug() << "Table created!";}
}
-
对数据库进行操作需要用到
QSqlQuery
类,操作前必须定义一个对象。 -
创建表格语句:
create table (f1 type1, f2 type2,…);
-
QSqlQuery
类在使用过程中有两种方式:(后边使用QSqlQuery类时等同)-
直接把语句写在
exec()
中sql_query.exec("create table student (id int primary key, name varchar(30), age int)");
-
分步写,利用
prepare()
函数,再使用exec()
-
2.5 插入数据
void SqliteOperator::InsertData()
{QString insert_sql = "insert into student values (?, ?, ?)";QSqlQuery sql_query;sql_query.prepare(insert_sql);sql_query.addBindValue(GetMaxId() +1);sql_query.addBindValue("Wang");sql_query.addBindValue(25);if(!sql_query.exec()){qDebug() << sql_query.lastError();}else{qDebug() << "inserted Wang!";}}
- 插入语句:
insert into values (value1, value2,…);
2.6 更新/修改数据
void SqliteOperator::UpdateData()
{QString update_sql = "update student set name = :name where id = :id";QSqlQuery sql_query;sql_query.prepare(update_sql);sql_query.bindValue(":name", "Qt");sql_query.bindValue(":id", 1);if(!sql_query.exec()){qDebug() << sql_query.lastError();}else{qDebug() << "updated!";}
}
- 语句:
update <table_name> set <f1=value1>, <f2=value2>… where <expression>;
2.7 查询数据——遍历查询、条件查询
2.7.1 遍历查询
void SqliteOperator::QueryAllData()
{QString select_all_sql = "select * from student";QSqlQuery sql_query;sql_query.prepare(select_all_sql);if(!sql_query.exec()){qDebug()<<sql_query.lastError();}else{while(sql_query.next()){int id = sql_query.value(0).toInt();QString name = sql_query.value(1).toString();int age = sql_query.value(2).toInt();qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);}}
}
- 查询部分
select <f1>, <f2>, ... from <table_name>;
- 查询所有
select * from <table_name>;
2.7.2 条件查询
void SqliteOperator::QueryData()
{QString select_sql = QString("select * from student where name = '%1' and (age = '%2' or age = '%3')").arg("Wang").arg(30).arg(25);QSqlQuery sql_query;if(!sql_query.exec(select_sql)){qDebug()<<sql_query.lastError();}else{while(sql_query.next()){int id = sql_query.value(0).toInt();QString name = sql_query.value(1).toString();qDebug()<<QString("id:%1 name:%2").arg(id).arg(name);}}
}
- 语句中
and
or
表示逻辑关系
3. 条件查询与遍历查询的对比
加循环建了一个包含229300条数据,7448kb的数据库。
条件查询耗时:30ms
遍历查询耗时:100ms
随着数据量的增加,差距应该会更明显。