qt sqlite 提高写入速度的方法 - 使用事务
首先pro引入库
QT += sql
.h
#ifndef SQLUTIL_H #define SQLUTIL_H #include <QtSql> #include <applicationbase.h> class SqlUtil : public QObject { Q_OBJECT signals: void sql_fail(QString msg); public: SqlUtil(); ~SqlUtil(); void open(); static SqlUtil* instance(); void insert(QString dateStr,QString num); void transaction(); void commit(); int count(); void clear(); QList<QMap<int,QString>> selectAll(); private: void createDbTable(); private: QSqlDatabase db; QSqlQuery sql_query; private: QVariantList datestr,values; }; #endif // SQLUTIL_H
.cpp
#include "sqlutil.h" SqlUtil::SqlUtil() { open(); } SqlUtil::~SqlUtil(){ commit(); db.close(); } void SqlUtil::open(){ db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("MyWieghtDB.db3"); // 数据库名与路径, 此时是放在同目录下 bool state = db.open(); // 连接数据库, 然后就可以使用了. if(!state){ emit sql_fail(tr("数据库打开失败!")); } sql_query = QSqlQuery("MyWieghtDB.db3"); // 清除以前的数据 clear(); // 创建数据表 createDbTable(); } SqlUtil* SqlUtil::instance(){ static SqlUtil* instance = new SqlUtil(); return instance; } void SqlUtil::insert(QString dateStr,QString num){
// 一万个数据提交一次事务,也就是说一万条之前先把数据存储在内存中 if(datestr.size() == 10000){ commit(); } if(datestr.size() == 0){ transaction(); } datestr << dateStr; values << num; } void SqlUtil::transaction(){ db.transaction(); } void SqlUtil::commit(){ qDebug() << "commit Success" << datestr.size(); if(datestr.size() > 0){ sql_query.prepare("insert into wieght (datestr,value) values(?,?)"); sql_query.addBindValue(datestr); sql_query.addBindValue(values); if(!sql_query.execBatch()){ qDebug() << "execBatch fail:" << sql_query.lastError().text(); } if(!db.commit()){ qDebug() << "commit fail:" << sql_query.lastError().text(); } datestr.clear(); values.clear(); } } void SqlUtil::createDbTable(){ bool state = sql_query.exec("CREATE TABLE wieght (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "datestr VARCHAR(100) NOT NULL, " "value VARCHAR(150) NOT NULL) "); if(!state){ emit sql_fail("数据表创建失败:" + sql_query.lastError().text()); } } int SqlUtil::count(){ sql_query.exec("SELECT count(*) FROM wieght"); sql_query.next(); return sql_query.value(0).toInt(); } void SqlUtil::clear(){ commit(); // DROP TABLE wieght if(!sql_query.exec("delete from wieght")){ qDebug() << "clear fail:" << sql_query.lastError().text(); }else{ qDebug() << "clear success"; } } QList<QMap<int,QString>> SqlUtil::selectAll(){ QList<QMap<int,QString>> resList; QString clear_sql = "SELECT * FROM wieght"; sql_query.prepare(clear_sql); if(!sql_query.exec()){ return resList; } while(sql_query.next()) { QMap<int,QString> itemMap; itemMap[0] = sql_query.value(1).toString(); itemMap[1] = sql_query.value(2).toString(); resList.append(itemMap); } return resList; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)