在 QT5 中使用 SQLITE

在我最近一直在做的有关 Kindle 批注管理软件的项目中,对于数据库我是用的是 SQLITE,在这篇文章中我会介绍一下 SQLITE 数据库,以及如何在 QT5 中使用它。

SQLITE 简介

WHAT IS SQLITE?

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

不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。

(来自百度百科

WHY SQLITE?

从 SQLITE 的用途来看,它是一款轻量级的数据库,并且一开始是设计给嵌入式设备的,我们知道 QT 其实现在也是在嵌入式方向应用的比较广泛,因此 QT 内置有 SQLITE 数据库的模块,因此我们能够比较容易上手。并且对于该项目使用文件形式的数据库更加灵活和轻便,更加符合这个项目的需求。

在 QT 中使用 SQLITE

0x00 修改 .pro 文件

为了能使用 SQLITE 我们必须在 QT 工程中的 .pro 文件中加入:

1
QT       += core gui sql

0x01 查看 QT 支持哪些数据库

我们可以通过 QSqlDatabase::drivers() 方法来获取当前的 sql 模快中支持哪些数据库,以我的 QT5 为例:

1
qDebug() << QSqlDatabase::drivers();

执行结果为:

1
("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")

我们可以看到当前的 QT 是包含有 SQLITE 驱动的。

0x02 创建一个数据库连接

我们来编写一个 connect() 函数:

1
2
3
4
5
6
7
8
9
10
bool connect(const QString &dbName)
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(dbName);
if (!db.open()) {
qDebug() << "Database Error!";
return false;
}
return true;
}

使用这个函数我们可以创建一个名称为 dbName 的 SQLITE 数据库。我们在 main 函数中测试一下:

1
2
3
4
5
6
7
if(connect("test.db")){
qDebug() << "Database Create Sucessfully!";
}
else{
qDebug() << "Database Create Failed!";

}

我们会看到在工程编译后的目录中生成了一个 test.db 文件,并且控制台输出了:

1
Database Create Sucessfully!

0x03 使用 SQL 语句

在 QT 中我们通过一个QSqlQuery实例执行 SQL 语句:

1
QSqlQuery query;

创建表

我们创建一个名叫 student 的表,包含三列id, name, age:

1
2
3
4
5
6
if (!query.exec("CREATE TABLE student ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name VARCHAR,"
"age INT)")) {
qDebug() << "Create Table Failed!";
}

插入条目

我们可以直接使用 query.exec() 来执行 INSERT 语句:

1
2
3
if(!query.exec("INSERT INTO student (name, age) VALUES (\"TOM\", 10)")){
qDebug() << "INSERT Failed!";
}

也可以使用下面的形式来一次添加多个条目:

1
2
3
4
5
6
7
8
9
10
11
query.prepare("INSERT INTO student (name, age) VALUES (?, ?)");
QVariantList names;
names << "Tom" << "Jack" << "Jane" << "Jerry";
query.addBindValue(names);
QVariantList ages;
ages << 20 << 23 << 22 << 25;
query.addBindValue(ages);
if (!query.execBatch()) {
qDebug() << "INSERT Failed!";
}
query.finish();

其它的语句都可以采用上面类似的方法进行实现,这里不再赘述。

这次我们使用 SQL 语句完成了对数据库的常规操作,包括简单的 CREATE、INSERT 等语句的使用。其实,Qt 不仅提供了这种使用 SQL 语句的方式,还提供了一种基于模型的更高级的处理方式。这种基于QSqlTableModel 的模型处理更为高级,如果对 SQL 语句不熟悉,并且不需要很多复杂的查询,这种QSqlTableModel模型基本可以满足一般的需求,以后我会介绍QSqlTableModel的一般使用。


本文的版权归作者 罗远航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!