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


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

    0、概述

      SQLite是一款开源、轻量级、跨平台的数据库,无需Server,无需安装和管理配置。它的设计目标是嵌入式的,所以很适合小型应用,也是Qt应用开发种常用的一种数据库。
      我们先设计一个简单的操作界面,最上面一行是六个操作按钮,分别实现数据库的连接、表格创建、数据查询,插入数据、修改数据以及删除数据。中间文纸是两个输入框,分别是输入姓名和年龄。最下面是一个图标显示。具体形式如下:

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

    1、连接数据库

      QSqlDatabase类提供了一个接口,用于通过连接访问数据。SQLite在单个文件上运行,在打开连接时必须将其设置为数据库名称。如果该文件不存在,SQLite将尝试创建它。
      我们实现一个连接数据库的函数,并在“连接数据库”按钮的槽函数中调用它来实现数据库的连接。具体的代码如下:

    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");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    2、创建数据表

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

    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";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

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

    3、添加数据

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

    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    4、修改数据

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

    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    5、删除数据

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

    void MainWindow::DeleteData()
    {
        QSqlQuery query;
        query.prepare("DELETE FROM staff WHERE name=?");
        query.addBindValue(ui->lineEditName->text());
        query.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    6、查询数据

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

    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++;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

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

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

    7、小结

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

    欢迎关注:

  • 相关阅读:
    MySQL的视图
    记录获取蓝鲸智云token的过程
    sqlcipher源码及编译
    基于STM32 CubeMX利用RTC实现带温湿度模块的万年历
    OpenCV-Mat类-图像表示
    编译安装apache
    微服务系统架构的演变
    【mac】常用命令01
    用递归函数和栈操作逆序栈
    05-jQuery的ajax
  • 原文地址:https://blog.csdn.net/foxclever/article/details/132781907