软件设计开发笔记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");
}

  在上述代码中,我们连接一个名称为“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";
    }
}

  运行完成创建表格命令后,我们使用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();
}

  我们在操作界面中添加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();
}

  在这里我们尝试将第条记录修改一下,我们在姓名框中输入“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();
}

  我们删除第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++;
    }
}

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

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

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

7、小结

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

欢迎关注:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值