软件设计开发笔记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数据库,增、删、改、查以及创建等都可很好的实现。

欢迎关注:

相关推荐
Ai 编码助手40 分钟前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
Mr.Q41 分钟前
Qt多边形填充/不填充绘制
qt
陈燚_重生之又为程序员1 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle1 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻1 小时前
MySQL排序查询
数据库·mysql
萧鼎1 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^1 小时前
数据库连接池的创建
java·开发语言·数据库
荒川之神1 小时前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师1 小时前
Oracle 23AI创建示例库
数据库·oracle
可峰科技1 小时前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt