Bootstrap

Qt 数据库SQLite 使用【01】基本功能

1.开发背景

        Qt 开发过程中难免需要存储数据,可以选择保存到本地文件,但是查找比较麻烦,所以就有了数据库,主要是方便查找数据,增删改查等操作,而 SqLite 属于数据库中轻量级的存在,适合本地数据存储功能。

2.开发需求

        Qt 界面上管理数据多个表的数据增删改查。

3.开发环境

        Window10 + Qt5.12.2 + QtCreator4.8.2

4.实现步骤

4.1 添加 SQL

        xxx.pro 文件添加 sql 模块

QT       += sql

4.2 软件编码

          主要头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QTextEdit>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

typedef struct
{
    quint32 num;
    QString name;
    QString data;

}ItemData_t;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:

private:
    Ui::MainWindow *ui;
    QSqlDatabase db;
    bool connectSQLite(QString name = "test.db");   // 连接数据库
    void disconnectSQLite(void);                    // 断开数据库

    bool addSQLiteForm(QString name);               // 增加表
    bool delSqLiteForm(QString name);               // 删除表
    void refreshFormShow(void);                     // 刷新表显示

    bool checkSQLiteItemExists(QString formName, quint32 num);
    bool addSQLiteItem(QString formName, const ItemData_t &item);           // 添加字段
    bool findSQLiteItem(QString formName, QString name, ItemData_t &item);  // 通过名字查找
    bool querySQLiteForm(QString formName);                                 // 查找整个数据表
    bool modifSQLiteItem(QString formName, QString name, QString dataNew);  // 修改数据库数据
    bool deleteSQLiteItem(QString formName, quint32 num);                   // 删除数据库字段
};

#endif // MAINWINDOW_H

        主要源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
#include <QInputDialog>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    /* 连接信号和槽 */
    connect(ui->pushButton_Open, &QPushButton::clicked, [this]()
    {
        if (db.isOpen())
        {
            QMessageBox::information(this, "提示", "数据库已打开");
            return;
        }

        connectSQLite();
    });

    connect(ui->pushButton_AddForm, &QPushButton::clicked, [this]()
    {
        QString formName = QInputDialog::getText(this, "输入", "请输入表名");
        addSQLiteForm(formName);
    });

    connect(ui->pushButton_DelForm, &QPushButton::clicked, [this]()
    {
        QString formName = ui->comboBox_Form->currentText();
        if (formName == nullptr)
        {
            QMessageBox::information(this, "提示", "数据表空");
            return;
        }

        delSqLiteForm(formName);
    });

    connect(ui->pushButton_Query, &QPushButton::clicked, [this]()
    {
        if (!db.isOpen())
        {
            QMessageBox::information(this, "提示", "数据库未打开");
            return;
        }

        QString formName = ui->comboBox_Form->currentText();
        querySQLiteForm(formName);
    });

    connect(ui->pushButton_Insert, &QPushButton::clicked, [this]()
    {
        if (!db.isOpen())
        {
            QMessageBox::information(this, "提示", "数据库未打开");
            return;
        }

        /* 添加数据 */
        QString formName = ui->comboBox_Form->currentText();
        ItemData_t item;
        item.num = ui->lineEdit_Number->text().toUInt();
        item.name = ui->lineEdit_Name->text();
        item.data = ui->lineEdit_Data->text();
        addSQLiteItem(formName, item);
    });

    connect(ui->pushButton_Find, &QPushButton::clicked, [this]()
    {
        QString formName = ui->comboBox_Form->currentText();
        ItemData_t item;
        item.name = ui->lineEdit_Name->text();
        findSQLiteItem(formName, item.name, item);
    });

    connect(ui->pushButton_Modif, &QPushButton::clicked, [this]()
    {
        QString formName = ui->comboBox_Form->currentText();
        QString name = ui->lineEdit_Name->text();
        QString dataNew = ui->lineEdit_Data->text();
        modifSQLiteItem(formName, name, dataNew);
    });

    connect(ui->pushButton_delete, &QPushButton::clicked, [this]()
    {
        QString formName = ui->comboBox_Form->currentText();
        quint32 num = ui->lineEdit_Number->text().toUInt();
        deleteSQLiteItem(formName, num);
    });

    /* 打开即连接 */
    connectSQLite();
}

MainWindow::~MainWindow()
{
    disconnectSQLite();
    delete ui;
}

/* 连接数据库 */
bool MainWindow::connectSQLite(QString name)
{
    /* 创建 SQLITE 数据库连接 */
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(name);

    /* 打开数据库 */
    if (!db.open())
    {
        QMessageBox::critical(this, "Database Error", db.lastError().text());
        return false;
    }

    /* 刷新表格显示 */
    refreshFormShow();

    /* 返回成功 */
    return true;
}

/* 断开数据库连接 */
void MainWindow::disconnectSQLite(void)
{
    /* 关闭数据库连接 */
    if (db.isOpen())
    {
        db.close();
    }
}

/* 添加数据表 */
bool MainWindow::addSQLiteForm(QString name)
{
    if (!db.isOpen())
    {
        return false;
    }

    QString createTableQuery = QString("CREATE TABLE IF NOT EXISTS %1 (id INTEGER PRIMARY KEY, num INTEGER, name TEXT, data TEXT)").arg(name);

    QSqlQuery query;
    if (!query.exec(createTableQuery))
    {
        return false;
    }

    /* 创建成功 刷新显示 */
    refreshFormShow();
    return true;
}

/* 删除表 */
bool MainWindow::delSqLiteForm(QString name)
{
    if (!db.isOpen())
    {
        return false;
    }

    QSqlQuery query;
    QString deleteTableQuery = QString("DROP TABLE IF EXISTS %1").arg(name);

    if (!query.exec(deleteTableQuery))
    {
        return false;
    }

    refreshFormShow();
    return true;
}

/* 刷新表显示 */
void MainWindow::refreshFormShow(void)
{
    /* 查询数据库所有表 */
    QSqlQuery query;
    if (!query.exec("SELECT name FROM sqlite_master WHERE type='table';"))
    {
        return;
    }

    /* 显示存在的表 */
    ui->comboBox_Form->clear();
    while (query.next())
    {
        QString tableName = query.value(0).toString();
        ui->comboBox_Form->addItem(tableName);
    }
}

/* 查找是否存在 */
bool MainWindow::checkSQLiteItemExists(QString formName, quint32 num)
{
    QString checkQuery = QString("SELECT COUNT(*) FROM %1 WHERE num = :num").arg(formName);

    QSqlQuery query;
    if (!query.prepare(checkQuery))
    {
        return false;
    }

    query.bindValue(":num", num);
    if (query.exec() && query.next())
    {
        int count = query.value(0).toInt();
        if (count > 0)
        {
            return true;
        }
    }

    return false;
}

/* 添加数据 */
bool MainWindow::addSQLiteItem(QString formName, const ItemData_t &item)
{
    if (checkSQLiteItemExists(formName, item.num))
    {
        return false;
    }

    /* 选择数据表 */
    QString insertDataQuery = QString("INSERT INTO %1 (num, name, data) VALUES (:num, :name, :data)").arg(formName);

    QSqlQuery query;
    if (!query.prepare(insertDataQuery))
    {
        return false;
    }

    query.bindValue(":num", item.num);
    query.bindValue(":name", item.name);
    query.bindValue(":data", item.data);

    if (!query.exec())
    {
        return false;
    }

    ui->lineEdit_Number->clear();
    ui->lineEdit_Name->clear();
    ui->lineEdit_Data->clear();

    return true;
}

/* 获取数据 数据 */
bool MainWindow::findSQLiteItem(QString formName, QString name, ItemData_t &item)
{
    if (!db.isOpen())
    {
        return false;
    }

    QString findDataQuery = QString("SELECT * FROM %1 WHERE name = :name").arg(formName);

    QSqlQuery query;
    if (!query.prepare(findDataQuery))
    {
        return false;
    }

    query.bindValue(":name", name);
    if (!query.exec())
    {
        return false;
    }

    QString result;
    while (query.next())
    {
        result += QString("ID: %1, Num: %2, Name: %3, Data: %4\n")
                 .arg(query.value(0).toInt())
                 .arg(query.value(1).toInt())
                 .arg(query.value(2).toString())
                 .arg(query.value(3).toString());
    }
    ui->textEdit_Query->setText(result);

    return true;
}

/* 显示数据库数据 */
bool MainWindow::querySQLiteForm(QString formName)
{
    if (!db.isOpen())
    {
        return false;
    }

    /* 选择表 */
    QString queryDataQuery = QString("SELECT * FROM %1").arg(formName);

    QSqlQuery query;
    if (!query.exec(queryDataQuery))
    {
        return false;
    }

    QString result;
    while (query.next())
    {
        result += QString("ID: %1, Num: %2, Name: %3, Data: %4\n")
                .arg(query.value(0).toInt())
                .arg(query.value(1).toInt())
                .arg(query.value(2).toString())
                .arg(query.value(3).toString());
    }
    ui->textEdit_Query->setText(result);

    return true;
}

/* 修改数据 */
bool MainWindow::modifSQLiteItem(QString formName, QString name, QString dataNew)
{
    if (!db.isOpen())
    {
        return false;
    }

    QString updateDataQuery = QString("UPDATE %1 SET data = :newData WHERE name = :name").arg(formName);

    QSqlQuery query;
    if (!query.prepare(updateDataQuery))
    {
        return false;
    }

    query.bindValue(":newData", dataNew);
    query.bindValue(":name", name);
    if (!query.exec())
    {
        return false;
    }

    return true;
}

/* 通过编号删除数据 */
bool MainWindow::deleteSQLiteItem(QString formName, quint32 num)
{
    if (!db.isOpen())
    {
        return false;
    }

    QString updateDataQuery = QString("DELETE FROM %1 WHERE num = :num").arg(formName);

    QSqlQuery query;
    if (!query.prepare(updateDataQuery))
    {
        return false;
    }

    // 执行查询
    query.bindValue(":num", num);
    if (!query.exec())
    {
        return false;
    }

    return true;
}

4.3 运行测试

        可以实现基本的增删改查,还可以,数据库的操作需要熟悉数据库语句

4.4 第三方工具 HeidiSQL

        主要是可以查看数据库的实际情况,使用方法如下,可以看到写入的字段

;