Qt5.9.6 vs2015 SQlite 数据库增删改查
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:
自研股票智能分析报警软件更新链接 - 一字千金 - 博客园
Qt使用数据库
目录
1 开发环境... 1
2 配置工作... 1
2.1 数据库驱动配置... 1
2.2 创建数据库增加数据库表格... 2
3 Qt使用数据库... 2
3.1 包含头文件和库文件... 3
3.2 初始化数据库... 3
3.3 打开数据库... 4
3.4 插入数据... 4
3.5 更新数据... 5
3.6 查询数据... 6
3.7 删除数据... 9
1 开发环境
Qt5.9.6 vs2015,使用QSQLITE保存数据到本地数据库文件。实现增删改查的功能。
2 配置工作
2.1 数据库驱动配置
将Qt安装目录下D:\QT\Qt5.9.6\5.9.6\msvc2015_64\plugins\的数据库驱动文件夹sqldrivers复制到你的开发程序exe路径下,如下图所示。
2.2 创建数据库增加数据库表格
使用Sqlite工具DB Browser for SQLite.exe创建数据库,并新建数据库的表格。
3 Qt使用数据库
3.1 包含头文件和库文件
3.2 初始化数据库
db_ = QSqlDatabase::addDatabase("QSQLITE");
QString dbpath = QCoreApplication::applicationDirPath() + "/localSqliteDb";
db_.setDatabaseName(dbpath);
3.3 打开数据库
if (!db_.open())
{
msg = tr("open local database fail");
break;
}
3.4 插入数据
Query是数据库请求,可以执行SQL语句,可以将数据组织成一个字符串,符合SQL的语法,就可以插入数据,也可以通过bindValue函数来绑定数值与SQL模板中的别名,例如绑定task中的数值name和SQL模板中的标签:name,执行SQL语句时,就会用task中的数值name替换:name,通过exec函数来执行SQL语句。
int LocalDb::onSaveTask(QVariantMap & task,QString& strMsg)
{int errorCode = -1;do{QSqlQuery query;query.prepare("INSERT INTO alarmTask (id, name,type,target,similarity,time,createtime) ""VALUES ( :id,:name,:type,:target,:similarity,:time,:createtime)");query.bindValue(":id", QUuid::createUuid());query.bindValue(":name", task.value("name"));query.bindValue(":type", task.value("type"));query.bindValue(":target", task.value("target"));query.bindValue(":time", task.value("time"));query.bindValue(":similarity", task.value("similarity"));query.bindValue(":createtime", task.value("createtime"));if (!query.exec()){QSqlError error = query.lastError();errorCode = error.type();strMsg = error.text();LOG_ERROR("insert task failed %s", strMsg.toStdString().c_str());break;}errorCode = 0;//创建图片解析任务} while (0);return errorCode;
}
3.5 更新数据
更新数据采用update语句。同样采用QSqlQuery方法
int LocalDb::onUpdateTask(QVariantMap & task, QString & strMsg){int errorCode = -1;do{QSqlQuery query;query.prepare("update alarmTask set name=:name,type=:type,target=:target,similarity=:similarity,time=:time,createtime=:createtime where id=:id");query.bindValue(":id", task.value("id"));query.bindValue(":name", task.value("name"));query.bindValue(":type", task.value("type"));query.bindValue(":target", task.value("target"));query.bindValue(":time", task.value("time"));query.bindValue(":similarity", task.value("similarity"));query.bindValue(":createtime", task.value("createtime"));if (!query.exec()){QSqlError error = query.lastError();strMsg = error.text();errorCode = error.type();LOG_ERROR("UpdateTask failed %s", strMsg.toStdString().c_str());break;}errorCode = 0;//创建图片解析任务} while (0);return errorCode;}
3.6 查询数据
在使用查询时,如果是多个条件,例如select * from vehicle where vehicletype in (: vehiclecolor),如果使用query.bindValue(":vehiclecolor ", task.value("vehiclecolor "));当vehiclecolor值为多个时,例如‘红’,‘黄’。如果用query.bindValue(":vehiclecolor", task.value("vehiclecolor"));绑定值,会发现执行语句时无效。只有用将颜色组织成字符串后才有效,strCondition += QString(" vehiclecolor in (%1) AND").arg(strtemp);
void LocalDb::SlotQueryVehicleByCondition(int pageno, int pagesize, QMap<QString, QMap<QString, QString>> cond){int errorCode = 0;QString msg;QString sqlcount = "SELECT count(*) from vehicle ";QVariantMap bindvalue;QString sqlserchpage = "SELECT * from vehicle ";//ORDER BY time DESC LIMIT :limit OFFSET :offset";QString strCondition = "";QString strtemp = "";if (cond.size() > 0){strCondition = "where";//车辆类型if (cond.contains("vehicletype")){strtemp = GetStringCondition(cond["vehicletype"].keys());strCondition += QString(" vehicletype in (%1) AND").arg(strtemp);}//车牌号码if (cond.contains("vehiclenum")){strtemp = cond["vehiclenum"]["vehiclenum"];strCondition += QString(" vehiclenum in ('%1') AND").arg(strtemp);}//特征标识if (cond.contains("mark")){if (cond["mark"].contains("副驾驶")){strCondition += QString(" visepilot in ('是') AND");}if (cond["mark"].contains("挂件")){strCondition += QString(" hangthing in ('是') AND");}if (cond["mark"].contains("遮阳板")){strCondition += QString(" hidesunplate in ('是') AND");}if (cond["mark"].contains("危险品")){strCondition += QString(" danger in ('是') AND");}}//车牌颜色if (cond.contains("platecolor")){strtemp = GetStringCondition(cond["platecolor"].keys());strCondition += QString(" platecolor in (%1) AND").arg(strtemp);}//车身颜色if (cond.contains("vehiclecolor")){strtemp = GetStringCondition(cond["vehiclecolor"].keys());strCondition += QString(" vehiclecolor in (%1) AND").arg(strtemp);}if (cond.contains("time")){if (cond["time"].contains("starttime")){strCondition += QString(" time >='%1' AND").arg(cond["time"]["starttime"]);}if (cond["time"].contains("endtime")){strCondition += QString(" time <='%1' AND").arg(cond["time"]["endtime"]);}}if (strCondition.right(4) == " AND")//去除最后的 AND{strCondition = strCondition.left(strCondition.length() - 4);}if (strCondition == "where")//无条件{strCondition = "";}}QVariantMap replyData;do{//先查出符合条件的总数量QSqlQuery countquery;//先删除数据库中的数据sqlcount += strCondition;countquery.prepare(sqlcount);if (!countquery.exec()|| !countquery.next()){QSqlError error = countquery.lastError();errorCode = error.type();msg = error.text();LOG_ERROR("query vehicle count failed,msg:%s", msg.toStdString().c_str());break;}quint64 totalCount = countquery.record().value(0).toULongLong();if (0 >= totalCount){break;}QVariantList dataList;QSqlQuery query;sqlserchpage += strCondition;sqlserchpage += QString(" ORDER BY time DESC LIMIT %1 OFFSET %2").arg(pagesize).arg((pageno)* pagesize);query.prepare(sqlserchpage);if (!query.exec()){QSqlError error = query.lastError();errorCode = error.type();msg = error.text();break;}while (query.next()){QSqlRecord record = query.record();int column = record.count();QVariantList recorditem;for (int i = 0; i < column; i++){QVariantMap data;data.insert("N", record.fieldName(i));data.insert("V", record.value(i));recorditem.append(data);}QVariantMap item;item.insert("data", recorditem);dataList.append(item);}replyData.insert("totalCount", totalCount);replyData.insert("data", dataList);} while (0);singalQueryVehicle(errorCode, msg, replyData);}
3.7 删除数据
删除数据用delete,如果清空表格,则不带where条件。同样如果是一次删除多条记录,不能用bindValue去绑定值,计时绑定的值是拼接好的字符串,并且加上了引号都没用,需直接组织一个字符串。将多个taskId的值添加到字符串中。
int LocalDb::deleteAlarmTask(QString id,QString& strMsg)
{if (id==""){return -1;}int errorCode = 0;QString msg;do{QSqlQuery query;//先删除数据库中的数据query.prepare("delete from alarmTask where id =:taskId");query.bindValue(":taskId",id);if (!query.exec()){QSqlError error = query.lastError();errorCode = error.type();msg = error.text();LOG_ERROR("delete %s failed,msg:%s", id.toStdString().c_str(), msg.toStdString().c_str());return -1;}} while (0);return 0;
}
Qt5.9.6 vs2015 SQlite 数据库增删改查相关推荐
- 基于python的SQLite数据库增删改查
与其他数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是一种嵌入式数据库,他的数据库就是一个文件.SQLite将整个数据库,包括定义.表.索引以及数据本身,作为一个单独的.可 ...
- IOS sqlite数据库增删改查
1.简介 简单封装sqlite数据库操作类 BaseDB 用于完成对sqlite的增删改查,使用前先导入libsqlite3.0.dylib库 2.BaseDB.h // // BaseDB.h // ...
- Android 绿豆通讯录【 SQLite数据库(增删改查、展示数据) + ListView数据展示控件(展示所有数据) 】
前情提要:Android 数据库(SQLite) [简介.创建.使用(增删改查.事务.实战演练).数据显示控件(ListView.Adapter.实战演练-绿豆通讯录)] https://blog.c ...
- Android Studio SQLite 数据库 增删改查 简单
源码 效果展示 所有操作都在这个界面完成,操作完直接显示 设计 一个class用来创建数据库,建表,一个activity用来执行增删改查操作 代码 DatebaseHlper impo ...
- SQLite数据库-增删改查语句
Android中自带的数据库----SQLite 这里使用Navicat工具来学习 1.创建新的SQLite连接 数据库文件名字和连接名一样就好 2.数据库的创建语句 //创建一个book表 crea ...
- Android SQLite数据库增删改查操作
一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字). TEXT(字符 ...
- ios Sqlite数据库增删改查基本操作
2019独角兽企业重金招聘Python工程师标准>>> 研究了几天的数据库,终于把它给搞出来了.Sqlite是ios上最常用的数据库之一,大家还是有必要了解一下的.这是仿照网上的一个 ...
- android 实现Sqlite的增删改查及系统的登录注册功能
文章目录 1.用户实体类 2.SQLiteOpenHelper类 3.数据库名常量类 4.数据库增删改查方法封装 5.界面设计 5.1 登录页面 5.2 注册界面 5.3 修改密码界面 6. 源码下载 ...
- 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现
常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现 以下方法全部亲测可用 //测试查找全部@Testpublic void testSelectAll(){List<U ...
- Mysql (一)Mysql 数据库增删改查
mysql数据库增删改查增:create database DBname charset gbk; 删:drop database DBname; 改:alter database DBname ch ...
最新文章
- CentOS7部署ELK5.2
- Python使用tpot获取最优模型并抽取最优模型模型参数
- 勒索软件出新招,小心你的隐私和財产安全!
- Java设计流程执行器_Java进阶面试精选系列:SpringMVC+SpringBoot+Hibernate+Mybatis+设计模式...
- python量化数据处理小细节(以后还会不断补充)
- mysql 异步复制建立过程_mysql生产环境高可用---基于GTID异步复制项目实施
- HDU1573 X问题【扩展欧几里得算法】
- RuiJie命令行划VLAN
- 不同版本操作系统和数据库的之间链接,和操作
- 机器视觉光源知识总结(二)
- JavaScript生成PDF
- Android吃鸡 3dtouch,绝地求生刺激战场3Dtouch怎么用 3Dtouch安卓手机可以用吗
- yarn install报错及解决办法
- 带你了解大数据时代的基本特征
- 接口和抽象类的区别是什么?抽象类必须要有抽象方法吗?抽象类能使用 final 修饰吗?
- 实验一 查看CPU和内存,用机器指令和汇编指令编程
- 世界著名logo设计文化解读
- 我热爱计算机作文450字,我的兴趣爱好作文450字精选5篇
- 谨慎处理 Service Worker 的更新
- 计算机应用与jaj,基于J2EE银鸽集团ERP系统的设计与应用-计算机应用技术专业论文.docx...