Qt5使用QSqlQuery读写sqlite3数据库
概述
- 本文将介绍使用 Qt5使用QSqlQuery读写sqlite3。
- 设计初衷: 项目需要使用配置文件,配置文件使用的是sqlite3 , 这是V1.0.0, 后期增加其他功能。
- 需要C++11支持(可删除代码中的c++11代码),不过后期可能会增加更多基于C++11代码
- Qt creator 的.pro文件需要加入: QT += sql
- 本文的项目是基于Qt creator的qmake编译的,非CMake.
- 本文涉及的Qt version: Qt5.14 (好像Qt5.9要是已经支持C++11, 具体的,大家可以google一下 )
- 本文使用的sqlite3可视化软件是:sqlite studio
功能
- 执行sql语句: 增加、删除、修改、查询
使用顺序
- 1.先调用函数 init_, 传入数据库文件
- 2.【1】返回0,再调用函数【get_record_】 或者 【exec_sql_】函数操作
- 3.可显示调用函数【uninit_】
sqlite_assistant.h
#ifndef SQLITE_ASSISTANT_H
#define SQLITE_ASSISTANT_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
namespace oct_db
{
/// 读写sqlite3
class sqlite_assistant : public QObject
{
Q_OBJECT
public:
explicit sqlite_assistant(QObject *parent = nullptr);
~sqlite_assistant();
/// 这些都需要屏蔽
sqlite_assistant(const sqlite_assistant& instance) = delete;
sqlite_assistant(const sqlite_assistant&& instance) = delete;
sqlite_assistant& operator = (const sqlite_assistant& instance) = delete;
sqlite_assistant& operator = (const sqlite_assistant&& instance) = delete;
/// --------------------------------------------------------------------------------
/// @brief: 初始化,str_db_file是数据库文件,例如: C:/demo/hello_sqlite.db3
/// @str_db_file - sqlite3数据库文件: 例如: C:/demo/demo.db3
/// @return - int
/// 0 - 成功
/// -2 - 失败, 参数【str_db_file】为空
/// -3 - 失败, 参数【str_db_file】文件不存在
/// -5 - 失败, 打开参数【str_db_file】的数据库失败
/// --------------------------------------------------------------------------------
int init_(const QString& str_db_file) noexcept;
/// --------------------------------------------------------------------------------
/// @brief: 查询表的数据, 如果没有调用函数 init_, 也将返回 nullptr
/// @str_table_name - 【str_table_name】表的名字
/// @return - QSqlQuery*
/// nullptr - 失败, 【str_table_name】为空、【数据库没有打开】、执行【SELECT* FROM table_name】语句失败 中的一种
/// 否则,成功
/// --------------------------------------------------------------------------------
QSqlQuery* get_record_(const QString& str_table_name);
/// --------------------------------------------------------------------------------
/// @brief: 执行sql语句,这里主要用作: 修改、删除、增加,查询用函数【get_record_】
/// @str_sql - sql语句
/// @return - int
/// 0 - 成功
/// -2 - 失败,参数【str_sql】为空
/// -3 - 失败,数据库没有打开,应该先调用函数 【init_】
/// -5 - 失败,执行sql语句失败,检查sql语句
/// --------------------------------------------------------------------------------
int exec_sql_(const QString& str_sql);
/// --------------------------------------------------------------------------------
/// @brief: 返回当前连接的数据库文件
/// @return - QString
/// --------------------------------------------------------------------------------
QString get_db_file();
/// --------------------------------------------------------------------------------
/// @brief: release the space at first, 可显示调用
/// @return - void
/// --------------------------------------------------------------------------------
void uninit_();
private:
/// 当前使用的数据库文件
QString str_db_file_;
/// 连接字符串
QString str_connection_;
///
QSqlDatabase sql_database_;
///
QSqlQuery *psqlquery_ = nullptr;
};
}
#endif // SQLITE_ASSISTANT_H
sqlite_assistant.cc
#include "sqlite_assistant.h"
#include <QFile>
namespace oct_db
{
sqlite_assistant::sqlite_assistant(QObject *parent) : QObject(parent)
{
str_connection_ = QString("sqlite_assistant");
}
sqlite_assistant::~sqlite_assistant()
{
uninit_();
}
int sqlite_assistant::init_(const QString &str_db_file) noexcept
{
/// 1. 字符串为空
if ((str_db_file.isNull()) || (str_db_file.isEmpty()) )
return -2;
/// 2..文件不存在
QFile db_file(str_db_file);
if (!db_file.exists())
return -3;
/// 保存文件名
str_db_file_ = str_db_file;
/// 2.5 断开先前的连接
uninit_();
/// 3. 连接数据库
if (QSqlDatabase::contains(str_connection_))
sql_database_ = QSqlDatabase::database(str_connection_);
else
sql_database_ = QSqlDatabase::addDatabase("QSQLITE", str_connection_);
/// 4.设置数据库名
sql_database_.setDatabaseName(str_db_file_);
/// 打开数据库
if (!sql_database_.open())
return -5;
if (nullptr != psqlquery_)
{
delete psqlquery_;
psqlquery_ = nullptr;
}
if (nullptr == psqlquery_)
psqlquery_ = new QSqlQuery(sql_database_);
/// 打开成功
return 0;
}
QSqlQuery *sqlite_assistant::get_record_(const QString& str_table_name)
{
/// 1. 字符串为空
if ((str_table_name.isNull()) || (str_table_name.isEmpty()) )
{
// str_err = QString("the parameter [str_table_name] is null");
return nullptr;
}
/// 2. 数据库没有打开
if (!sql_database_.isOpen())
{
// str_err = QString("failure, the database didn't open");
return nullptr;
}
if (nullptr == psqlquery_)
{
// str_err = QString("failure, db file is openned, but the /*QSqlQuery*/ object created failure");
return nullptr;
}
/// 3.构建sql语句、执行,并返回结果
QString str_sql = QString("SELECT * FROM ") + str_table_name;
bool flag = psqlquery_->prepare(str_sql);
if (!psqlquery_->exec())
{
// str_err = QString("failure, the error is from executing sql");
return nullptr;
}
return psqlquery_;
}
int sqlite_assistant::exec_sql_(const QString &str_sql)
{
/// 1. 字符串为空
if ((str_sql.isNull()) || (str_sql.isEmpty()) )
return -2;
if (!sql_database_.isOpen())
return -3;
if (nullptr == psqlquery_)
return -5;
psqlquery_->prepare(str_sql);
bool is_success = psqlquery_->exec();
return ( (true == is_success) ? 0 : -6);
}
void sqlite_assistant::uninit_()
{
try
{
if (nullptr != psqlquery_)
{
psqlquery_->clear();
delete psqlquery_;
psqlquery_ = nullptr;
}
if (sql_database_.isOpen())
sql_database_.close();
}
catch(...)
{
/// take the exception and do not expand
}
}
QString sqlite_assistant::get_db_file()
{
return str_db_file_;
}
}
调用示例
准备了一张表,内容如下;
包含头文件
#include <QApplication>
#include "sqlite_assistant.h"
using namespace oct_db;
#include <QDebug>
#include <QSqlQuery>
#include <QStringLiteral>
调用代码
/// 1.创建数据据访问对象
sqlite_assistant* psq = new sqlite_assistant;
if (nullptr == psq)
return a.exec();
/// 2.准备数据库文件
QString str_db_file = QApplication::applicationDirPath() + QString("/cmd_makeup.db3");
qDebug() << "\n\n 33333 rstr_db_fileet=" << str_db_file << "\n\n\n";
/// 3.调用初始化数据库操作
int ret = psq->init_(str_db_file);
qDebug() << "\n\n AAA ret=" << ret << "\n\n\n";
/// 4.查询【手机】表中的内容
QSqlQuery* pquery = psq->get_record_(QStringLiteral("手机"));
if (nullptr == pquery)
{
qDebug() << "\n\n error pquery is null \n\n";
}
else
{
/// 读取测试
while(pquery->next())
{
/// 读取并显示一行数据, 与数据库中的对应
qDebug() << "no=" << pquery->value(QStringLiteral("序号")).toString() << ", ";
qDebug() << "name=" << pquery->value(QStringLiteral("名称")).toString() << ", ";
qDebug() << "value=" << pquery->value(QStringLiteral("值")).toString() << "\n";
}
}
/// 5. 执行sql语句测试
QString str_sql = QStringLiteral("UPDATE 手机 SET 名称='ABC' WHERE 序号='1'");
qDebug() << "\n\n sql = " << str_sql << "\n\n";
qDebug () << "\n\n ret = " << psq->exec_sql_(str_sql) << "\n\n";
/// 6.下面这句可显示调用,也可以不用调用,因为析构函数中已经做了调用
psq->uninit_();
执行结果:
完整演示代码
#include "dialog.h"
#include <QApplication>
#include "sqlite_assistant.h"
using namespace oct_db;
#include <QDebug>
#include <QSqlQuery>
#include <QStringLiteral>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
/// 1.创建数据据访问对象
sqlite_assistant* psq = new sqlite_assistant;
if (nullptr == psq)
return a.exec();
/// 2.准备数据库文件
QString str_db_file = QApplication::applicationDirPath() + QString("/cmd_makeup.db3");
qDebug() << "\n\n 33333 rstr_db_fileet=" << str_db_file << "\n\n\n";
/// 3.调用初始化数据库操作
int ret = psq->init_(str_db_file);
qDebug() << "\n\n AAA ret=" << ret << "\n\n\n";
/// 4.查询【手机】表中的内容
QSqlQuery* pquery = psq->get_record_(QStringLiteral("手机"));
if (nullptr == pquery)
{
qDebug() << "\n\n error pquery is null \n\n";
}
else
{
/// 读取测试
while(pquery->next())
{
/// 读取并显示一行数据, 与数据库中的对应
qDebug() << "no=" << pquery->value(QStringLiteral("序号")).toString() << ", ";
qDebug() << "name=" << pquery->value(QStringLiteral("名称")).toString() << ", ";
qDebug() << "value=" << pquery->value(QStringLiteral("值")).toString() << "\n";
}
}
/// 5. 执行sql语句测试
QString str_sql = QStringLiteral("UPDATE 手机 SET 名称='ABC' WHERE 序号='1'");
qDebug() << "\n\n sql = " << str_sql << "\n\n";
qDebug () << "\n\n ret = " << psq->exec_sql_(str_sql) << "\n\n";
/// 6.下面这句可显示调用,也可以不用调用,因为析构函数中已经做了调用
psq->uninit_();
return a.exec();
}
Qt5使用QSqlQuery读写sqlite3数据库的更多相关文章
- 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...
- QT 读写sqllite数据库
QT 读写sqllite数据库 分类: 技术资料2014-04-10 10:39 84人阅读 评论(0) 收藏 举报 #include <QtGui/QApplication> #incl ...
- C语言使用SQLite3数据库
原文:C语言使用SQLite3数据库 SQLite是一个著名的免费数据库(不管是商用还是私人使用都免费),已经向众多公司如Adobe, Airbus, Apple, google, GE, Micro ...
- SQLite3数据库
#SQLite可视化管理工具(SQLite Expert Pro) SQLite特点: 1. 遵守ACID(原子性.一致性.隔离性和持久性)的关系型数据库管理系统:2. 不是一个C/S结构的数据库引擎 ...
- 加密sqlite3数据库文件
目录 EncryptSqlite3 实现原理 使用方法 不足之处 GitHub地址 EncryptSqlite3 加密sqlite3数据库,产生的数据库文件别人打不开. 实现原理 在写入文件前对每个字 ...
- 安卓使用SQlite3数据库无法id主键无法自动增加?不是的。
安卓使用SQlite3数据库无法id主键无法自动增加?不是的. 要这样写:id integer primary key ,要写integer而不是int所以会报错! http://blog.csdn. ...
- 【转】去掉Sqlite3 数据库中的前后回车换行符(newline)
原文: http://www.blogjava.net/pts/archive/2013/06/10/400... 时间: 2013-06-10 转自:http://www.ityuedu.com/a ...
- 《全唐诗》的sqlite3数据库
下载地址: http://pan.baidu.com/s/1b2mE54quantangshi.db是sqlite3数据库,包括2张表.index表:volume 列(整数,主键) 表示卷号,从1到9 ...
- [Android]AndroidInject增加sqlite3数据库映射注解(ORM)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3623050.html AndroidInject项目是我写的一 ...
随机推荐
- 【豆科基因组】普通豆/菜豆/四季豆Common bean (Phaseolus vulgaris L.) 683个自然群体重测序2020NG
目录 一.来源 二.结果 683份材料重测序 地方种landraces和育种品系breeding lines的多样性 表型和基因-环境互作(G by E) 菜豆产量潜力相关的MTAs(显著关联位点) ...
- wireshatk_teach
wireshark抓包新手使用教程 Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息.常用于开发测试过程各种问题定位.本文主要内容包括: 1.Wiresha ...
- Linux之文件读取查看之cat、head、tail、tac、rev、more、less
Linux文件查看的命令有很多,如cat.head.tail.tac.rev.more.less等 1. cat之查看文件内容 NAME cat - 连接文件并在标准输出上打印(concatenate ...
- 【系统硬件】英伟达安培卡 vs 老推理卡硬件参数对比
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 本文分享一下英伟达安培卡 vs 老推理 ...
- PC端申请表
公司项目需求中要做用html做一个PDF申请表的样式出来.有点意思,贴上来大家看看. 先上效果图: 附上源代码: HTML:<div id="form"> <h2 ...
- MapReduce02 序列化
目录 MapReduce 序列化 概述 自定义序列化 常用数据序列化类型 int与IntWritable转化 Text与String 序列化读写方法 自定义bean对象实现序列化接口(Writable ...
- postgresql安装部署
一.下载安装: 1.下载: 官网下载地址:https://www.postgresql.org/download/linux/redhat/ 也可以用这个:https://www.enterprise ...
- CR LF 的含义
可以参考: 转载于:https://www.cnblogs.com/babykick/archive/2011/03/25/1995977.html
- [项目总结]关于调用系统照相机Activity被销毁问题解决
在项目中需要启用系统照相机来拍照.本来很容易的一个问题.但在适配中出现了问题. 简单说一下问题: 有些手机拍照成功,有些手机拍完照后确定返回后activity数据丢失,被销毁了. 问题查找: 经过代码 ...
- ACE_Message_Block实现浅析
ACE_Message_Block实现浅析1. 概述ACE_Message_Block是ACE中很重要的一个类,和ACE框架中的重要模式的实现 如ACE_Reactor, ACE_Proactor, ...