概述

  • 本文将介绍使用 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. Codeforces 1158F - Density of subarrays(dp,神仙题)

    Codeforces 题目传送门 & 洛谷题目传送门 人生中第一道 *3500(显然不是自己独立 AC 的),不过还是祭一下罢 神仙 D1F 首先考虑对于给定的序列 \(a_1,a_2,\do ...

  2. Vue 中使用 extent 开发loading等全局 组件

    Vue 中使用 extend 开发组件 简介:再开发过程中那面会遇到自定义 loading alert 等全局组件,这里我们可以使用 vue 中的extend 来帮助我们完成 一个简单extend例子 ...

  3. 【GS基础】植物基因组选择研究人员及数量遗传学发展一览

    目录 1.GS研究 2.数量遗传发展 GS应用主要在国外大型动物和种企,国内仍以学术为主.近期整理相关学术文献,了解到一些相关研究人员,记录下备忘查询,但不可能全面. 1.GS研究 Theo Meuw ...

  4. 7本Python必读的入门书籍,你看过吗?(附福利)

    Python入门书籍不用看太多,看一本就够.重要的是你要学习Python的哪个方向,或者说你对什么方向感兴趣,因为Python这门语言的应用领域比较广泛,比如说可以用来做数据分析.机器学习,也可以用来 ...

  5. 设置administrator账号密码

    设置administrator账号密码: 打开:附件->运行 输入:lusrmgr.msc 在里面的用户里修改administrator密码

  6. WebRTC视频分辨率设置

    前面我们能够打开摄像头.getUserMedia()时会传入参数,在参数里我们可以指定宽高信息.通过宽高参数控制输出的视频分辨率. html 在页面上摆放一些元素,下面是主要部分 <div id ...

  7. mysql数据操作语言DML

    插入insert 插入方式1 语法: insert into 表名(列名,....) values(值1,....) 说明: 1.插入的值的类型要与列的类型一致或兼容 2.可以为null的值:①列写了 ...

  8. day25 组合和内置函数

    day25 组合和内置函数 一.组合 # 解决类与类之间代码冗余问题: 1. 继承 2. 组合 组合:一个对象拥有一个属性, 属性的值必须是另外一个对象 继承满足的是:什么是什么的关系 # is-a ...

  9. Learning Spark中文版--第五章--加载保存数据(1)

      开发工程师和数据科学家都会受益于本章的部分内容.工程师可能希望探索更多的输出格式,看看有没有一些适合他们下游用户的格式.数据科学家可能会更关注他们已经使用的数据格式. Motivation   我 ...

  10. GPU随机采样速度比较

    技术背景 随机采样问题,不仅仅只是一个统计学/离散数学上的概念,其实在工业领域也都有非常重要的应用价值/潜在应用价值,具体应用场景我们这里就不做赘述.本文重点在于在不同平台上的采样速率,至于另外一个重 ...