注本文是自己平时学习整理的资料方便自己查阅可能存在问题或知识涵盖不全仅供参考。本项目使用的sqlite数据库其他数据库操作逻辑类似一、建立数据库采用手动或者Navicat创建一个数据库具体操作参考下面这篇博客SQLite数据库的使用——利用命令行或Navicat Premium创建数据库_navicat premium新建一个db文件-CSDN博客二、查询数据库连接1.检查数据库连接1.1 检查数据库是否打开if (sqlDb.isOpen()) { return true; }1.2 读取配置文件具体配置参见下方设置配置文件QSettings settings(STR_CONFIG_PATH, QSettings::IniFormat); if (!QFile::exists(STR_CONFIG_PATH)) { qWarning() QStringLiteral(配置文件不存在使用默认数据库路径) DEFAULT_DB_FILE; // 初始化默认配置并保存 InitConfig(settings); }1.3 读取数据库路径配置settings.beginGroup(STR_CONFIG_GROUP); QString strDbFilePath settings.value(STR_DB_FILE_PATH, DEFAULT_DB_FILE).toString(); settings.endGroup(); // 必须配对endGroup避免分组污染 // 检查数据库文件所在目录是否存在不存在则创建 QDir dbDir QFileInfo(strDbFilePath).absoluteDir(); if (!dbDir.exists()) { if (!dbDir.mkpath(.)) { qCritical() QStringLiteral(创建数据库目录失败) dbDir.absolutePath(); return false; } }1.4 检查SQLite驱动if (!QSqlDatabase::isDriverAvailable(QSQLITE)) { qCritical() SQLite驱动未加载请检查Qt SQL模块是否正确部署; return false; }1.5 连接名设置if (QSqlDatabase::contains(strConnectName)) { sqlDb QSqlDatabase::database(strConnectName); } else { sqlDb QSqlDatabase::addDatabase(QSQLITE, strConnectName); } // 设置数据库文件路径 sqlDb.setDatabaseName(strDbFilePath);1.6 打开数据库并设置打印信息便于调试if (!sqlDb.open()) { qCritical() QStringLiteral(数据库打开失败) sqlDb.lastError().text(); qCritical() QStringLiteral(数据库文件路径) strDbFilePath; return false; } qDebug() QStringLiteral(数据库连接成功文件路径) strDbFilePath; return true;2.设置配置文件2.1 配置常量声明这种路径写法可能存在一些问题const QString STR_CONFIG_PATH ../../Config/config.ini; //配置文件路径 const QString STR_CONFIG_GROUP ALPDBOperator; //数据库相关配置分组 const QString STR_DB_FILE_PATH dbFilePath; //数据库文件路径 const QString DEFAULT_DB_FILE QDir::currentPath() /Config/ALP.db;2.2 配置代码void CALPDBOperator::InitConfig(QSettings settings) { // 确保分组正确避免嵌套 settings.beginGroup(STR_CONFIG_GROUP); // 仅当配置项不存在时设置默认值 if (!settings.contains(STR_DB_FILE_PATH)) { settings.setValue(STR_DB_FILE_PATH, DEFAULT_DB_FILE); settings.sync(); qDebug() QStringLiteral(初始化默认数据库配置) DEFAULT_DB_FILE; } settings.endGroup(); // 配对endGroup }2.3 配置文件注意配置文件路径里要确实存在相应db文件才行。[ALPDBOperator] dbFilePath../../Data/DataBase/ALP.db注意配置常量一定要和配置文件的内容对应不然无法读取。三、建表表名、字段及字段类型可根据具体情况进行调整打印的信息是为了方便查找错误若追求简洁可去掉。bool CAirlineRepository::CreateTbl() { // 1. 判断数据库是否打开 if (!m_airlineDB.isOpen()) { qDebug() QStringLiteral([CreateTbl] 数据库未打开); return false; } //2.开启事务 if (!m_airlineDB.transaction()) { qDebug() QStringLiteral([CreateTbl] 开启事务失败) m_airlineDB.lastError().text(); return false; } QSqlQuery query(m_airlineDB); bool isTableExist false; // 3. 兼容SQLite的表存在性检查 // SQLite通过查询sqlite_master系统表判断表是否存在 query.exec(R(SELECT 1 FROM sqlite_master WHERE typetable AND nameairline_info)); if (query.next()) { isTableExist true; qDebug() QStringLiteral([CreateTbl] 航线表已存在无需创建); //表已存在时提交空事务 if (!m_airlineDB.commit()) { qDebug() QStringLiteral([CreateTbl] 提交空事务失败) m_airlineDB.lastError().text(); m_airlineDB.rollback(); return false; } return true; } // 4. 表不存在时创建 bool createOk query.exec(R(CREATE TABLE IF NOT EXISTS airline_info ( id INTEGER PRIMARY KEY, task_id INTEGER, name TEXT, width INTEGER, type INTEGER, color INTEGER, points BLOB, distance real ))); // 5. 完善错误处理输出具体原因 if (!createOk) { qDebug() QStringLiteral([CreateTbl] 创建航线表失败) query.lastError().text(); m_airlineDB.rollback(); return false; } //6.创建成功提交事务 if (!m_airlineDB.commit()) { qDebug() QStringLiteral([CreateTbl] 提交创建表事务失败) m_airlineDB.lastError().text(); m_airlineDB.rollback(); return false; } qDebug() QStringLiteral([CreateTbl] 创建航线表成功); return true; }四、向数据库增加数据1.前置校验if (!m_airlineDB.isOpen()) { qCritical() QStringLiteral(AddAirline失败数据库未打开); return false; }2.开启事务if (!m_airlineDB.transaction()) { qCritical() QStringLiteral(开启事务失败) m_airlineDB.lastError().text(); return false; }3.判断是否存在航线IDif (QueryIsExistByID(nID)) { qWarning() QStringLiteral(AddAirline失败航线ID已存在ID) nID; m_airlineDB.rollback(); // 回滚空事务避免事务悬挂 return false; }4.定义新增预处理SQL模板QSqlQuery query(m_airlineDB); QString strPoints VectorToJsonString(airlineInfo.m_vecAirlinePoint); QByteArray bytePoints strPoints.toUtf8(); QString strSql R( INSERT INTO airline_info(id, task_id, name, width, type, color, points, distance) VALUES(:id, :task_id, :name, :width, :type, :color, :points, :distance) );5.预处理SQL语句if (!query.prepare(strSql)) { QString strError query.lastError().text(); qDebug() strError; return false; }6.绑定参数//6.绑定所有参数 query.bindValue(:id, nID); query.bindValue(:task_id, airlineInfo.m_nTaskID); query.bindValue(:name, QString::fromStdString(airlineInfo.m_strName)); query.bindValue(:width, airlineInfo.m_nAirlineWidth); query.bindValue(:type, airlineInfo.m_eAirlineType); query.bindValue(:color, static_castint(airlineInfo.m_unColor)); query.bindValue(:points, bytePoints); query.bindValue(:distance, airlineInfo.m_dTotalDistance);7.执行新增操作if (!query.exec()) { qCritical() QStringLiteral(AddAirline失败) query.lastError().text(); return false; }8.提交事务if (!m_airlineDB.commit()) { qCritical() QStringLiteral(提交事务失败 ) m_airlineDB.lastError().text(); m_airlineDB.rollback(); return false; } qDebug() QStringLiteral(航线数据插入成功ID ) nID; return true;其他操作查、删、改逻辑同新增这里不再赘述。