什么是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结束吧,事物锁引起的还是其他原因没有深究,目前是没有报这个错误了。
截图



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