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项目是我写的一 ...
随机推荐
- Perl语言入门10-13
----------第十章 其他控制结构---------------- unless结构 unless($fred =~ /\A[A-Z_\w*\z]/i){print "yes" ...
- Perl调用和管理外部文件中的变量(如软件和数据库配置文件)
编写流程时,有一个好的习惯是将流程需要调用的软件.数据库等信息与脚本进行分离,这样可以统一管理流程的软件和数据库等信息,当它们路径改变或者升级的时候管理起来就很方便,而不需要去脚本中一个个寻找再修改. ...
- C语言小练习 微型学生管理系统
很简陋,没有做输入校验,以写出来为第一目的,中间出了不少问题,尤其是结构体内字符串赋值的时候(理解不透彻),字符串比较用strcmp不能直接==判定,逻辑也很重要,不然会出现莫名其妙的问题. 涉及知识 ...
- sqlalchemy模块的基本使用
Python中SQLAlchemy模块通过建立orm来对数据库进行操作 1. 建表 方式1 # -*- coding:utf-8 -*- # Author:Wong Du from sqlalchem ...
- mysql 索引的注意事项
mysql 无法使用索引的查询 索引是什么,为什么要用索引,索引使用的时候要注意什么,那些情况下索引无法起作用. 1,索引是什么 mysql的索引也是一张表,并且是一个有序的表,主要记录了需要索引的数 ...
- C#集合Dictionary中按值的排序
C#集合Dictionary中按值的降序排列 static void Main(string[] args) { Dictionary<string, int> d ...
- Redis | 第8章 发布订阅与事务《Redis设计与实现》
目录 前言 1. 发布订阅 1.1 频道的订阅与退订 1.2 模式的订阅与退订 1.3 发送消息 1.4 查看订阅消息 2. 事务 2.1 事务的实现 2.2 WATCH 命令的实现 2.3 事务的 ...
- 【模板】二分图最大权完美匹配(KM算法)/洛谷P6577
题目链接 https://www.luogu.com.cn/problem/P6577 题目大意 给定一个二分图,其左右点的个数各为 \(n\),带权边数为 \(m\),保证存在完美匹配. 求一种完美 ...
- A Child's History of England.47
CHAPTER 13 ENGLAND UNDER RICHARD THE FIRST, CALLED THE LION-HEART In the year of our Lord one thousa ...
- CVTE第二次笔试
选择瞎答得,直接编程题目 1. 使用递归将字符串中的数字去并按顺序打印 输入例 adfsafsfs123123eogie09789 输出例 123123 09789 #include<iost ...