Qt -- 1、QT连接数据库(SQLite3)
视频教程链接:https://www.bilibili.com/video/BV1Li4y1f7ho?p=3.
类 QSqlDatabase
上图中的静态成员函数 addDatabase 的第一个参数 type 表示的是我要连接的这个数据库是什么类型的一个数据库,或者说我连接的是一个什么数据库软件。第二个参数是默认参数,不用管。
类 QSqlDatabase的常用接口
上面函数 setDatabaseName 和 removeDatabase 的参数是要打开或关闭数据库文件路径。
下面开始在 QT 软件中来操作一下。
首先要加入头文件 #include <QSqlDatabase>(这里在 main.cpp 中)
从图中可以看到在头文件下面会有一条黄色的线并且显示没有这么一个文件或目录。那为什么会是这样的呢?
这就要了解一下 QT 的架构,它的整个框架是分模块的。我们常用的有两个模块,分别是 Qt Core 和 QT GUI 模块。
而 QSqlDatabase 是属于 Qt SQL 这个模块的。因此还要在项目中添加这个模块。那怎么添加呢?我们要在项目下的 xxx.pro 文件中添加一句话。
QT += sql
如下图所示。
此时,再在 main.c 中看下。
这表明添加成功了。
接下来,要创建一个 QSqlDatabase 的对象,但是它不能通过构造函数来创建,需要通过静态函数 addDatabase 来创建 Sqlite3 数据库的连接。
代码如下:
//创建一个 QSqlDatabase 的对象
//但是它不能通过构造函数来创建,需要通过静态函数
//创建Sqlite3数据库的连接
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
之后,指定要打开哪一个数据库文件,看代码。
//指定要打开哪一个数据库文件(填写该数据库文件的路径)
db.setDatabaseName("/home/chantui/work/code/sqlite3Pro/stu.db");
//判断是否打开成功
if(db.open()==false)
{
qDebug()<<"打开失败";
}
如果指定路径的数据库文件不存在,将会自动创建一个。
如果想要创建在当前工程目录下,则不需要指定路径,而只写文件名。
db.setDatabaseName("stu.db");
最后,当我们对数据库操作完之后,还要关闭数据库,代码如下。
db.close();
db.removeDatabase("/home/chantui/work/code/sqlite3Pro/stu.db");
代码截图如下:
运行代码,我们来看下效果。到工程目录下(选择你指定构建器的目录),
对连接数据库的工作进行封装
单例模式
图片内容来源链接: https://www.runoob.com/design-pattern/singleton-pattern.html.
(上图后面,还有一部分关于单例模式的实现方式,可以通过链接调整过去看下,由于本章重点并非放到单例模式上,所以这里不深入往下进行,如果非要区分本节的单例模式的实现属于哪一种,则应该属于懒汉式,不支持线程,是最基本的单例模式的实现方式。)
好,下面来实现下。
首先,创建一个文件,
这里类名取为 DBHelper (任意取),
然后点击下一步,直到完成,完成之后,打开 DPHelper.h 文件
#ifndef DBHELPER_H
#define DBHELPER_H
#include <QSqlDatabase>
class DBHelper
{
public:
//向外界公开一个“获取唯一可用的对象”的成员函数
static DBHelper* getInstance();
private:
//创建一个 QSqlDatabase 的对象 db,之后要在构造函数中对 db 对象进行初始化
QSqlDatabase db;
static DBHelper* Instance ;
//因为是单例模式,所以让构造函数为 private,这样该类就不会被实例化
DBHelper();
};
#endif // DBHELPER_H
在 DPHelper.cpp 中,
#include "DBHelper.h"
DBHelper* DBHelper::Instance=0;
DBHelper* DBHelper::getInstance()
{
if(Instance==0)
Instance =new DBHelper();
return Instance;
}
DBHelper::DBHelper()
{
//在构造函数中对 db 对象进行初始化
db = QSqlDatabase::addDatabase("QSQLITE");
}
void DBHelper::createConnection()
{
//我们需要指定数据库文件
db.setDatabaseName("tec.db");
db.open();
}
void DBHelper::destoryConnection()
{
db.close();
db.removeDatabase("stu.db");
}
这样就将这个单例给实现了。
那么,在这个单例过程之中,我们又希望通过单例的对象来对这个 db 对象进行创建数据库文件、打开数据库文件和关闭数据库文件的操作。所以要在 DPHelper 类中再提供相关的接口。
在 main.cpp 中,我们首先来包含一下我们创建这个类的头文件 #include “DBHelper.h”。
然后,调用接口来实现数据库的连接和断开。
#include "mainwindow.h"
#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include "DBHelper.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
DBHelper* helper = DBHelper::getInstance();
helper->createConnection();
helper->destoryConnection();
MainWindow w;
w.show();
return a.exec();
}
运行代码,如下图所示,数据库文件 tec.db 就被创建出来了。
车辆_小学生: 这好像是假的多线程啊,通过QThread::currentThreadId()输出当前线程数据,发现和主线程是一样的
?John?: 好文,有些我一直没懂的地方讲的挺清楚
2301_80366833: 写的乱七八糟
沐风、轻羽: 写得很清晰,我小白都看懂了,优质好文!
GraduationRick: 出自《UNIX环境高级编程》