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; }
复制代码

 

posted @   浅笑19  阅读(994)  评论(0编辑  收藏  举报
编辑推荐:
· 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)
点击右上角即可分享
微信分享提示