QT (c++语言) - 调用sqlite

什么是QT

简单来说,就是一个UI工具包,这个工具包是跨平台的,能在Windows、Unix、甚至安卓上运行,底层业务语言可以选择C和python。

什么是sqlite

轻量级的数据库,安卓应用首选数据库,只需要一个驱动包就可以使用了,其中不需要服务应用的支撑,数据部分只是一个文件即可,容易迁移,轻量等诸多优势。

QT调用sqlite

更改配置文件

找到pro文件,新增sql包的引入。

QT       += core gui sql

引入头文件

#include <QSqlQuery>
#include <QSqlDatabase>
#include <QSqlError>

业务代码

QSqlDatabase db; // 定义SQL连接驱动
bool database::init(){
        if(QSqlDatabase::contains("qt_sql_default_connection"))//增加这步是为了防止重复连接数据库
            db = QSqlDatabase::database("qt_sql_default_connection");
        else
            db = QSqlDatabase::addDatabase("QSQLITE");//添加sqlite类型的数据库
        db.setDatabaseName("records.db");//指定数据库名
        if(db.open()){
            qDebug()<<"open success";
            database::exec(createRecordTable); // 创建表SQL
            database::exec(createRecordTable_idx1); // 创建索引SQL
        }
        return true;
}

// 这里简单的封装一下
bool database::exec(QString sql){ // 执行sql
    if(!db.isOpen())db.open();
    QSqlQuery execution(db);
    if(execution.exec(sql)){
            execution.finish();
            return true;
    }else{
            execution.finish();
            qDebug()<<"execute error"<<execution.lastError();
            return false;
    }
}

QVector<QVector<QVariant>> database::query(QString sql,int columnNumber){ // 执行查询sql
    if(!db.isOpen())db.open();
    QSqlQuery execution2(db);
    execution2.exec(sql);
    QVector<QVector<QVariant>> tvector;
    while(execution2.next()){
            QVector<QVariant> tmap;
            for(int i=0;i<columnNumber;i++){
                tmap.insert(i,execution2.value(i));
            }
            tvector.append(tmap);
    }
    execution2.finish();
    return tvector;
}
// 解析每日记录
std::map<std::string, long long>  database::getDayRecords(QString date){
    std::map<std::string, long long> keyRecord;
    QVector<QVector<QVariant>>  loads = database::query(queryDayRecords.arg(date),3); // 3指的是有三个字段
    QVector<QVector<QVariant>>::iterator iter;
    iter = loads.begin(); // 使用迭代器遍历行数据
    while (iter != loads.end()) { // iter其中就是每一行中的具体数据,根据索引获取确切的记录值
        keyRecord[iter->at(1).toString().toStdString()] = iter->at(2).toLongLong();
        iter++;
    }
    return keyRecord;

}

踩雷

报错 Unable to fetch row

我的解决方案是每次查询操作完成后,执行execution.finish();,可以理解为session结束吧,事物锁引起的还是其他原因没有深究,目前是没有报这个错误了。

截图

image.png

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。