QT数据库使用-SQLite

本文最后更新于:2022年5月29日 上午

SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。

前言

SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。

SQLite(sql)是一款开源轻量级的数据库软件,不需要server,QT自带SQLite数据库,不需要再安装。

用法

Step1: 准备

  1. 引入SQL模块
    在Qt项目文件(.pro文件)中,加入SQL模块:

    1
    QT += sql
  2. 引用头文件
    在需要使用SQL的类定义中,引用相关头文件。例如:

    1
    2
    3
    #include <QSqlDatabase>
    #include <QSqlQuery>
    #include <QSqlError>

Step2: 使用

指令方式

例程下载

提取码: seh9

1. 建立数据库

1
2
3
4
// 添加Sqlite数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库
db.setDatabaseName("demo.db");
  • addDatabase()的参数QSQLITE是SQLite对应的驱动名。
  • setDatabaseName()的参数是数据库文件名。

2. 打开数据库

使用open()打开数据库,并判断是否成功。

1
2
3
4
5
// 打开数据库
if(!db.open()) {
QMessageBox::critical(NULL,"Database Error",db.lastError().text());
return ;
}

3. 关闭数据库

数据库操作完成后,最好关闭。

1
database.close();

4. 操作数据库

对数据库进行操作需要用到QSqlQuery类,操作前必须定义一个对象。下面举例说明操作方法。操作需要使用SQLite语句,本文中的几个例子会使用几个常用的语句,关于SQLite语句的具体信息请参考SQLite相关资料。

例1:创建表格
创建一个名为user的表格,表格包含两列,第一列是名字,第二列是密码信息。

1
2
3
4
QSqlQuery query;
if(!query.exec("CREATE TABLE user (name VARCHAR(255), password VARCHAR(255))")) {
QMessageBox::critical(NULL,"Database Error",query.lastError().text());
}

注意 :只能创建一个同名的表格,否则会报错。

例2:插入数据

在刚才创建的表格中,插入一行数据。

1
2
3
4
5
6
7
8
9
10
11
12
query.prepare("INSERT INTO user (name, password) VALUES (?, ?)");
// 给字段设置内容和绑定相应的值
QVariantList names;
names << "Admin" << "Tom" << "Kane" << "Jerry";
query.addBindValue(names);
QVariantList passwords;
passwords << "admin" << "87654321" << "20211204" << "12345678";
query.addBindValue(passwords);
// 执行预处理命令
if(!query.execBatch()) {
QMessageBox::critical(NULL,"Database Error",query.lastError().text());
}

例4:查询数据

1
2
3
4
5
6
7
query.exec("SELECT name, password FROM user");
while (query.next()) { // 一行一行遍历
// << query.value(0).toString()
// << query.value(1).toString();
qDebug() << query.value("name").toString()
<< query.value("password").toString();
}

界面模型操作方式

主要使用QSqlTableModel和界面控件tableView来实现数据库的界面操作使用,如下图。

image-20211204204922466

例程下载

提取码: fsjb

1. 建立数据库

1
2
3
4
// 添加Sqlite数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库,如果没有该数据库文件请先手动创建
db.setDatabaseName("demo.db");
  • addDatabase()的参数QSQLITE是SQLite对应的驱动名。
  • setDatabaseName()的参数是数据库文件名,如果运行目录下没有该数据库文件demo.db请先手动创建。

2. 打开数据库

使用open()打开数据库,并判断是否成功。

1
2
3
4
5
// 打开数据库
if(!db.open()) {
QMessageBox::critical(NULL,"错误",db.lastError().text());
return ;
}

3. 操作数据库

把数据库设置显示在界面上

1
2
3
4
5
6
7
8
9
10
// 设置模型
model = new QSqlTableModel(this);
model->setTable("user"); // 指定使用哪个表
ui->tableView->setModel(model); // 把model放在界面控件tableView
model->select(); // 显示model里的数据

model->setHeaderData(0, Qt::Horizontal, "用户");
model->setHeaderData(1, Qt::Horizontal, "密码");
// 设置model的编辑模式,手动提交修改
model->setEditStrategy(QSqlTableModel::OnManualSubmit);

添加操作

1
2
3
4
5
// 添加空记录
QSqlRecord record = model->record(); // 获取空记录
// 获取行号
int row = model->rowCount();
model->insertRecord(row, record);

**删除操作 **

1
2
3
4
5
6
7
8
// 获取选中的模型
QItemSelectionModel *sModel = ui->tableView->selectionModel();
// 取出模型中的索引
QModelIndexList list = sModel->selectedRows();
// 删除所有选中的行
for(int i = 0; i < list.size(); i++) {
model->removeRow( list.at(i).row() );
}

取消操作

1
2
model->revertAll();
model->submitAll()

查找

1
2
3
4
QString name = ui->lineEditName->text();
QString str = QString("name = '%1'").arg(name);
model->setFilter(str);
model->select();

QT数据库使用-SQLite
https://kevinloongc.github.io/posts/50944f7c.html
作者
Kevin Loongc
发布于
2021年12月4日
许可协议