软件设计开发笔记4:QT操作SQLite数据库

有时候我们需要在软件中记录一些历史数据以便于对数据的查询。而我们希望软件不能太复杂,体量也不要太大,这个时候就需要如SQLite这样轻量级的数据库。这篇中我们就来讨论如何在使用QT开发应用是操作SQLite数据库。

0、概述

SQLite是一款开源、轻量级、跨平台的数据库,无需Server,无需安装和管理配置。它的设计目标是嵌入式的,所以很适合小型应用,也是Qt应用开发种常用的一种数据库。

我们先设计一个简单的操作界面,最上面一行是六个操作按钮,分别实现数据库的连接、表格创建、数据查询,插入数据、修改数据以及删除数据。中间文纸是两个输入框,分别是输入姓名和年龄。最下面是一个图标显示。具体形式如下:

在开发之前,如果我们使用QtCreator则需要在*.pro中引入sql模块(QT+=sql),如果是VS中在Qt VS Tool里勾选上sql模块,就可以使用该模块的接口了。

1、连接数据库

QSqlDatabase类提供了一个接口,用于通过连接访问数据。SQLite在单个文件上运行,在打开连接时必须将其设置为数据库名称。如果该文件不存在,SQLite将尝试创建它。

我们实现一个连接数据库的函数,并在"连接数据库"按钮的槽函数中调用它来实现数据库的连接。具体的代码如下:

C++ 复制代码
void MainWindow::ConnectDatabase()
{
    if(QSqlDatabase::contains("qt_sql_default_connection"))
    {
        db = QSqlDatabase::database("qt_sql_default_connection");\
    }
    else
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
    }

    db.setDatabaseName("DBTest.db");
}

在上述代码中,我们连接一个名称为"DBTest.db"的数据库,但这个数据库一开始是没有的,所以运行这段代码后会创建一个名为"DBTest.db"的数据库。运行完成后我们使用SQLiteStudio查看,发现已经创建了一个名为"DBTest.db"的数据库,并可一连接上。如下图:

2、创建数据表

接下来,我们创建一个数据表。其中QSqlQuery类可以使用SQL语句来实现与数据库交互。所以在这里我们使用该类操作SQL语句穿件一个数据表。在这里我们创建一个名为staff的表格,该表中包括3个字段:id字段作为主键并自动增长;name字段和age字段用于存储信息。具体代码如下:

C++ 复制代码
void MainWindow::CreateTable()
{
    const QString sql="CREATE TABLE IF NOT EXISTS staff (id   INTEGER   PRIMARY KEY AUTOINCREMENT NOT NULL,name CHAR (50) UNIQUE NOT NULL,age  INTEGER)";

    //QSqlQuery构造前,需要db已打开并连接
    //未指定db或者db无效时使用默认连接进行操作
    QSqlQuery query;

    if(query.exec(sql))
    {
        qDebug()<<"init table success";
    }
    else
    {
        //打印sql语句错误信息
        qDebug()<<"init table error";
    }
}

运行完成创建表格命令后,我们使用SQLiteStudio查看数据的内容。连接数据库可以看到staff表格以及包含的3个字段,说明创建成功,具体如下图:

关于QSqlQuery类,他是封装在QSqlDatabase上,用以执行SQL查询中创建,导航和检索数据所涉及的功能。它可以被用来执行DML(数据操纵语言)语句,例如select、insert、update、delete,以及DDL(数据定义语言)语句,如create table。在后续的增、删、改、查等操作中也是使用该类。

3、添加数据

我们已经创建了表格,接下来我们尝试向表格中添加数据。在这里我们使用QSqlQuery类中的prepare()方法来预设SQL语句,然后再通过bindValue()方法加入数据。具体实现代码如下:

C++ 复制代码
void MainWindow::InsertData()
{
    QSqlQuery query;
    query.prepare("INSERT INTO staff (name,age) VALUES (:name,:age)");
    query.bindValue(":name", ui->lineEditName->text());
    query.bindValue(":age", ui->lineEditAge->text());
    query.exec();
}

我们在操作界面中添加3条记录,分别在姓名框和年龄框中输入名字和年龄点击"插入数据"按钮实现对数据的插入。完成后显示如下:

4、修改数据

接下来我们尝试对表中的数据进行修改。我们依然使用QSqlQuery类中的prepare()方法来预设SQL语句,然后再通过bindValue()方法加入数据。具体实现代码如下:

C++ 复制代码
void MainWindow::UpdateData()
{
    QSqlQuery query;

    query.prepare("UPDATE staff SET age=:age WHERE name=:name");
    query.bindValue(":name",ui->lineEditName->text());//通过自定义的别名来替代
    query.bindValue(":age",ui->lineEditAge->text());
    query.exec();
}

在这里我们尝试将第条记录修改一下,我们在姓名框中输入"Rose",在年龄框中输入"31",将Rose的年龄有28修改为31。输入完成点击"修改数据"按钮,结果如下:

5、删除数据

接下来我们尝试删除数据。我们依然使用QSqlQuery类中的prepare()方法来预设SQL语句,然后再通过bindValue()方法加入数据。我们实现根据姓名来删除数据,具体实现代码如下:

C++ 复制代码
void MainWindow::DeleteData()
{
    QSqlQuery query;
    query.prepare("DELETE FROM staff WHERE name=?");
    query.addBindValue(ui->lineEditName->text());
    query.exec();
}

我们删除第3条数据,我们在姓名框中输入"Rose",然后点击"删除数据"按钮,得到结果如下:

6、查询数据

最后我们来实现数据的查询问题。依然是使用QSqlQuery类,我们在这里使用查询表格全部内容的方式。具体的实现代码如下:

C++ 复制代码
void MainWindow::QueryData()
{
    ui->tableWidget->clear();
    QStringList header;
    header<<"id"<<"name"<<"age";
    ui->tableWidget->setHorizontalHeaderLabels(header);

    int i=0;

    QSqlQuery query("SELECT * FROM staff");
    while (query.next())
    {
        ui->tableWidget->setItem(i,0,new QTableWidgetItem(query.value(0).toString()));
        ui->tableWidget->setItem(i,1,new QTableWidgetItem(query.value(1).toString()));
        ui->tableWidget->setItem(i,2,new QTableWidgetItem(query.value(2).toString()));
        i++;
    }
}

我们现在删除后的表格中添加2条数据。分别是姓名"Rose"年龄"33"和姓名"Jake"年龄"45"两条数据。然后重新连接数据库并点击"查询数据"按钮,得到如下结果:

同时我们也可以使用SQLiteStudio直接产看数据库的内容,具体如下:

两种方式查询到的结果是一样的,说明我们的操作是正确的。

7、小结

在这一篇中我们尝试了使用QT操作SQLite数据库,增、删、改、查以及创建等都可很好的实现。

欢迎关注:

相关推荐
2401_8979300615 分钟前
使用Docker轻松部署Neo4j图数据库
数据库·docker·neo4j
诗句藏于尽头24 分钟前
Django模型与数据库表映射的两种方式
数据库·python·django
周周记笔记44 分钟前
学习笔记:第一个Python程序
笔记·学习
丑小鸭是白天鹅1 小时前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
潘达斯奈基~1 小时前
《大数据之路1》笔记2:数据模型
大数据·笔记
寻星探路1 小时前
数据库造神计划第六天---增删改查(CRUD)(2)
java·大数据·数据库
..过云雨1 小时前
05.【Linux系统编程】进程(冯诺依曼体系结构、进程概念、进程状态(注意僵尸和孤儿)、进程优先级、进程切换和调度)
linux·笔记·学习
咸甜适中1 小时前
rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
笔记·学习·rust·egui
一又四分之一.1 小时前
高数基础知识(下)②
笔记
盖世英雄酱581362 小时前
Read timed out问题 排查
java·数据库·后端