Qt SQlite 代码解析(私人用)

69 阅读3分钟

头文件包含

#include "sq.h"
#include <QSqlError>
#include <QDebug>
#include <QMutex>

判断数据库是否打开

bool SQ::isDatabaseOpen(const QSqlDatabase& db) const {
    if (!db.isOpen()) {
        qDebug() << "数据库未打开";
        return false;
    }
    return true;
}

打开数据库

QSqlDatabase SQ::OpenDatabase(const QString& dbPath, const QString& connectionName) {

    // 这一段代码的功能是判断数据库连接是否还存在,如果仍然存在线关闭之前的连接,避免造成资源浪费
    if (QSqlDatabase::contains(connectionName)) {
        QSqlDatabase oldDb = QSqlDatabase::database(connectionName);
        if (oldDb.isOpen()) {
            oldDb.close();
            QSqlDatabase::removeDatabase(connectionName);
            qDebug() << "旧数据库连接已关闭并移除";
        }
    }

    // 在关闭连接之后就可以打开数据库了
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
    db.setDatabaseName(dbPath);

    if (db.open()) {
        qDebug("数据库连接成功");
    } else {
        qDebug()<< "数据库连接失败:" << db.lastError().text();
    }
    
    return db;
 }

给数据库添加表(初始化数据库)

这里创建了,芯片表,版本表,结构体表,参数表和宏表,其中的连接关系是

graph LR
a[芯片表]-->b[版本表]
b[版本表]-->c[结构体表]
c[结构体表]-->d[参数表]
c[结构体表]-->e[宏表]

使用外键进行连接


void SQ::InitSQ(const QString& connectionName) {
    // 获取数据库连接
    QSqlDatabase db = QSqlDatabase::database(connectionName);

    // 检查数据库是否已打开
    if (!db.isOpen()) {
        qDebug() << "数据库未打开";
        return;
    }

    QSqlQuery query(db);

    // 创建表
    query.exec("CREATE TABLE IF NOT EXISTS chip (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");
    query.exec("CREATE TABLE IF NOT EXISTS version (id INTEGER PRIMARY KEY AUTOINCREMENT, chip_id INTEGER, name TEXT NOT NULL, FOREIGN KEY (chip_id) REFERENCES chip(id))");
    query.exec("CREATE TABLE IF NOT EXISTS structure (id INTEGER PRIMARY KEY AUTOINCREMENT, version_id INTEGER, name TEXT NOT NULL, base_address INTEGER, FOREIGN KEY (version_id) REFERENCES version(id))");
    query.exec("CREATE TABLE IF NOT EXISTS parameter (id INTEGER PRIMARY KEY AUTOINCREMENT, structure_id INTEGER, name TEXT NOT NULL, offset INTEGER, data_type TEXT, absolute_address INTEGER, FOREIGN KEY (structure_id) REFERENCES structure(id))");
    query.exec("CREATE TABLE IF NOT EXISTS macro (name TEXT PRIMARY KEY, value INTEGER NOT NULL, structure_id INTEGER, FOREIGN KEY (structure_id) REFERENCES structure(id))");

    qDebug() << "数据库表已初始化";
}

给芯片表添加芯片

给某表添加记录的一般方法都是:

graph TD

a["QSqlQuery query(db);" 创建查询变量]-->b[query.prepare语句]-->c[query.addBindValue 添加绑定值]-->d[query.exec 判断执行是否成功]
bool SQ::AddChip(const QString& connectionName, const QString& chipName) {

    QSqlDatabase db = QSqlDatabase::database(connectionName);
    if (!isDatabaseOpen(db)) return false;

    QSqlQuery query(db);
    
    // 在name字段下面添加芯片
    query.prepare("INSERT INTO chip (name) VALUES (?)");
    query.addBindValue(chipName);

   // 执行一次
    if (!query.exec()) {
        qDebug() << "添加失败:" << query.lastError().text();
        return false;
    }
    qDebug("添加成功");
    return true;
}

在芯片表删除芯片(递归删除对应芯片下的版本)

bool SQ::RemoveChip(const QString& connectionName, const QString& chipName) {
    QSqlDatabase db = QSqlDatabase::database(connectionName);
    if (!isDatabaseOpen(db)) return false;

    QSqlQuery query(db);
    query.prepare("SELECT id FROM chip WHERE name = ?");
    query.addBindValue(chipName);

    if (!query.exec() || !query.next()) {
        qDebug() << "芯片查询失败或未找到:" << query.lastError().text();
        return false;
    }

    int chipId = query.value(0).toInt();
    if (!db.transaction()) {
        qDebug() << "无法启动事务:" << db.lastError().text();
        return false;
    }

    // 删除版本记录和芯片记录
    if (!executeDeleteQuery(db, "DELETE FROM version WHERE chip_id = ?", chipId) ||
        !executeDeleteQuery(db, "DELETE FROM chip WHERE id = ?", chipId)) {
        db.rollback();
        return false;
    }

    if (!db.commit()) {
        qDebug() << "无法提交事务:" << db.lastError().text();
        return false;
    }

    qDebug() << "芯片及其所有版本已成功删除";
    return true;
}

bool SQ::executeDeleteQuery(QSqlDatabase& db, const QString& queryStr, int id) {
    QSqlQuery query(db);
    query.prepare(queryStr);
    query.addBindValue(id);

    if (!query.exec()) {
        qDebug() << "删除失败:" << query.lastError().text();
        return false;
    }
    return true;
}

关闭数据库

bool SQ::CloseDatabase(QSqlDatabase db) {
    QString connectionName = db.connectionName();
    db.close();

    QMetaObject::invokeMethod(Q_NULLPTR, [connectionName]() {
        QSqlDatabase::removeDatabase(connectionName);
    }, Qt::QueuedConnection);

    return true;
}

获取芯片id

`int SQ::getChipId(QSqlDatabase& db, const QString& chipName) {
    QSqlQuery query(db);
    query.prepare("SELECT id FROM chip WHERE name = ?");
    query.addBindValue(chipName);

    if (!query.exec() || !query.next()) {
        qDebug() << "查询芯片失败或未找到:" << query.lastError().text();
        return -1;
    }
    return query.value(0).toInt();
}

loadChips(将芯片信息加载到combobox)

void SQ::loadChips(const QString& connectionName, QComboBox* comboBox) {
    QSqlDatabase db = QSqlDatabase::database(connectionName);
    if (!isDatabaseOpen(db)) return;

    comboBox->clear();
    QSqlQuery query(db);
    query.prepare("SELECT id, name FROM chip");

    if (query.exec()) {
        while (query.next()) {
            comboBox->addItem(query.value("name").toString(), query.value("id").toInt());
        }
        qDebug() << "芯片信息已加载到 ComboBox";
    } else {
        qDebug() << "查询芯片失败:" << query.lastError().text();
    }
}

loadVersions(同理)

void SQ::loadVersions(const QString& connectionName, const QString& chipName, QComboBox* comboBox) {
    QSqlDatabase db = QSqlDatabase::database(connectionName);
    if (!isDatabaseOpen(db)) return;

    int chipId = getChipId(db, chipName);
    if (chipId == -1) {
        qDebug() << "芯片未找到,无法加载版本";
        return;
    }

    comboBox->clear();
    QSqlQuery query(db);
    query.prepare("SELECT id, name FROM version WHERE chip_id = ?");
    query.addBindValue(chipId);

    if (query.exec()) {
        while (query.next()) {
            comboBox->addItem(query.value("name").toString(), query.value("id").toInt());
        }
        qDebug() << "版本信息已加载到 ComboBox";
    } else {
        qDebug() << "查询版本失败:" << query.lastError().text();
    }
}

添加版本

bool SQ::AddVersion(const QString& connectionName, const QString& chipName, const QString& versionName) {
    QSqlDatabase db = QSqlDatabase::database(connectionName);
    if (!isDatabaseOpen(db)) return false;

    int chipId = getChipId(db, chipName);
    if (chipId == -1) {
        qDebug() << "芯片未找到,无法添加版本";
        return false;
    }

    QSqlQuery query(db);
    query.prepare("INSERT INTO version (chip_id, name) VALUES (?, ?)");
    query.addBindValue(chipId);
    query.addBindValue(versionName);

    if (!query.exec()) {
        qDebug() << "版本添加失败:" << query.lastError().text();
        return false;
    }
    qDebug() << "版本添加成功";
    return true;
}