概述

  • 本文将介绍使用 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数据库的更多相关文章

  1. 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

    作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...

  2. QT 读写sqllite数据库

    QT 读写sqllite数据库 分类: 技术资料2014-04-10 10:39 84人阅读 评论(0) 收藏 举报 #include <QtGui/QApplication> #incl ...

  3. C语言使用SQLite3数据库

    原文:C语言使用SQLite3数据库 SQLite是一个著名的免费数据库(不管是商用还是私人使用都免费),已经向众多公司如Adobe, Airbus, Apple, google, GE, Micro ...

  4. SQLite3数据库

    #SQLite可视化管理工具(SQLite Expert Pro) SQLite特点: 1. 遵守ACID(原子性.一致性.隔离性和持久性)的关系型数据库管理系统:2. 不是一个C/S结构的数据库引擎 ...

  5. 加密sqlite3数据库文件

    目录 EncryptSqlite3 实现原理 使用方法 不足之处 GitHub地址 EncryptSqlite3 加密sqlite3数据库,产生的数据库文件别人打不开. 实现原理 在写入文件前对每个字 ...

  6. 安卓使用SQlite3数据库无法id主键无法自动增加?不是的。

    安卓使用SQlite3数据库无法id主键无法自动增加?不是的. 要这样写:id integer primary key ,要写integer而不是int所以会报错! http://blog.csdn. ...

  7. 【转】去掉Sqlite3 数据库中的前后回车换行符(newline)

    原文: http://www.blogjava.net/pts/archive/2013/06/10/400... 时间: 2013-06-10 转自:http://www.ityuedu.com/a ...

  8. 《全唐诗》的sqlite3数据库

    下载地址: http://pan.baidu.com/s/1b2mE54quantangshi.db是sqlite3数据库,包括2张表.index表:volume 列(整数,主键) 表示卷号,从1到9 ...

  9. [Android]AndroidInject增加sqlite3数据库映射注解(ORM)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3623050.html AndroidInject项目是我写的一 ...

随机推荐

  1. DirectX12 3D 游戏开发与实战第五章内容

    渲染流水线 学习目标: 了解用于在2D图像中表现出场景立体感和空间深度感等真实效果的关键因素 探索如何用Direct3D表示3D对象 学习如何建立虚拟摄像机 理解渲染流水线,根据给定的3D场景的几何描 ...

  2. .NET6控制台程序使用quartz.net

    1.新建一个名为"ConsoleQuartz"的.NET6控制台程序. 2.nuget中安装Quartz和Quartz.Plugins,这2个DLL. 3.新建一个HelloQua ...

  3. 【机器学习与R语言】4-决策树

    目录 1.决策树原理 2.决策树应用示例 2.1)收集数据 2.2)探索和准备数据 2.3)训练模型 2.4)评估模型性能 2.5)提高模型性能 通过自适应增强算法(boosting) 将惩罚因子分配 ...

  4. Golang知识点整理

    1. Golang 1.1 golang知识点大纲 1.2 指针 1.3 Golang使用validator进行数据校验及自定义翻译器 1.4 Golang GC(垃圾回收机制) 2.框架 2.1 G ...

  5. lsof之列出已打开的文件

    lsof命令常用解析 Linux中常用 lsof 来查看文件调用进程等相关信息,也可用来查看活跃的进程信息和端口监听进程信息等 1. lsof 命令介绍 NAME lsof - list open f ...

  6. Linux——基础命令用法(下)

    一.linux用户 1.什么是用户 用户是用来运行某一些进程.拥有某一些文件或目录. 在Linux里面,用户分成三大类:root用户.系统用户.普通用户. 用户是用UID来唯一标识身份的,且root用 ...

  7. 06 windows安装Python+Pycharm+Scrapy环境

    windows安装Python+Pycharm+Scrapy环境 使用微信扫码关注微信公众号,并回复:"Python工具包",免费获取下载链接! 一.卸载python环境 卸载以下 ...

  8. 9 — springboot整合jdbc、druid、druid实现日志监控 — 更新完毕

    1.整合jdbc.druid 1).导入依赖 <dependency> <groupId>org.springframework.boot</groupId> &l ...

  9. JavaScript获取html表单值验证后跳转网页中的关键点

    关键代码: 1.表单部分 <form action="Depart.jsp" name="myform" method="post" ...

  10. 2021广东工业大学十月月赛 F-hnjhd爱序列

    题目:GDUTOJ | hnjhd爱序列 (gdutcode.cn) 一开始是用双指针从尾至头遍历,但发现会tle!! 后来朋友@77给出了一种用桶的做法,相当于是用空间换时间了. 其中用到的一个原理 ...