自我感觉趋于完美的单例模式
用于存界面一个数据库表,目前只有一个数据库存了一个IP地址
QSqlDatabase类的sqlite数据库在Qt的项目工程里反复使用,使用单例加禁止拷贝构造,加互斥锁保证线程安全
头文件
#ifndef SQLITEDB_H
#define SQLITEDB_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDir>
#include <QApplication>
#include <QDebug>
#include <QMutex>
#include <QMutexLocker>
/* "OvenIPTable" (Id INTEGER PRIMARY KEY AUTOINCREMENT,OvenIP TEXT NOT NULL); // Id一直为1*/
class sqliteDB : public QObject
{
Q_OBJECT
public:
static sqliteDB* getInstance();
QSqlDatabase& getDatabase();
bool initDB();
bool createSettingConfigTable(); //创建设置配置表
QString getOvenIPAddress(); //获取设置配置
bool updateOvenIPAddress(QString IPAddress);//更新设置配置表
signals:
void sig_logInfo(QString info);
private :
sqliteDB();
~sqliteDB();
sqliteDB(const sqliteDB&) = delete; //禁止拷贝构造
sqliteDB& operator=(const sqliteDB&) = delete; //禁止赋值操作
static sqliteDB* instance;
QMutex mutex;
QSqlDatabase db;
QString m_sDBName;
QString m_sDBPath;
};
#endif // SQLITEDB_H
实现
#include "sqliteDB.h"
// 静态成员初始化
sqliteDB* sqliteDB::instance = nullptr;
sqliteDB::sqliteDB()
: QObject(), db(QSqlDatabase::addDatabase("QSQLITE", "OvenIPTable"))
{
m_sDBName = "entryStation.db";
m_sDBPath = QDir::currentPath()+"/res/db";
if(initDB())
{
qDebug() << "OvenIPTable数据库连接成功";
}
}
sqliteDB::~sqliteDB()
{
}
sqliteDB* sqliteDB::getInstance()
{
if(!instance)
{
instance = new sqliteDB();
}
return instance;
}
QSqlDatabase& sqliteDB::getDatabase()
{
if(!db.isOpen())
{
if(!initDB())
{
qWarning()<<"Database not initialized or cannot be opened ";
}
}
return db;
}
bool sqliteDB::initDB()
{
QDir db_dir;
if(!db_dir.exists(m_sDBPath))
{
bool success = db_dir.mkpath(m_sDBPath);
if(success)
{
qDebug()<<"创建路径成功!";
}else
{
qWarning()<<"创建路径失败!";
return false;
}
}
QString dir = m_sDBPath+"/"+m_sDBName;
qDebug() << dir;
//db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(dir);
if(!db.open())
{
qWarning()<<"数据库打开失败";
return false;
}
qDebug() << "__________XXXXX";
// 创建表(如果尚未存在)
if ( !createSettingConfigTable()) {
return false;
}
return true;
}
//创建设置配置表,只需要主机的IP
bool sqliteDB::createSettingConfigTable()
{
QMutexLocker locker(&mutex);
if(!db.isOpen())
{
return false;
}
bool createRet = false;
if(db.tables().contains("OvenIPTable"))
{
createRet = true;
}
else
{
QSqlQuery query(db);
QString str_createSql = QString("create table if not exists OvenIPTable ( \
Id INTEGER PRIMARY KEY AUTOINCREMENT,\
OvenIP TEXT NOT NULL)");
createRet = query.exec(str_createSql);
if(!createRet)
{
qWarning()<<"创建IP配置表失败!"<<query.lastError().text();
}
else
{
//第一次创建,默认存储主机连接的IP
QString str_insertSql = QString("insert into OvenIPTable values(1,'192.168.155.200')");
if(!query.exec(str_insertSql))
{
qWarning()<<"Insert default setting Error="<<query.lastError().text();
}
}
}
return createRet;
}
//获取设置配置
QString sqliteDB::getOvenIPAddress()
{
QMutexLocker locker(&mutex);
QString IPAddress;//返回的主机IP地址
if(!db.isOpen())
{
return "";
}
QSqlQuery query(db);
QString str_selectSql = QString("select OvenIP from OvenIPTable where Id = 1;");
if(query.exec(str_selectSql))
{
while (query.next())
{
IPAddress = query.value(0).toString() ;
}
}
return IPAddress;
}
//更新表主机IP
bool sqliteDB::updateOvenIPAddress(QString IPAddress)
{
QMutexLocker locker(&mutex);
if(!db.isOpen())
{
return false;
}
QSqlQuery query(db);
QString str_selectSql = QString("REPLACE INTO OvenIPTable(Id,OvenIP) VALUES(1,'%1');").arg(IPAddress);
if(!query.exec(str_selectSql))
{
qWarning()<<"update ip_config error"<<query.lastError().text();
emit sig_logInfo("保存IP设置失败!");
return false;
}
return true;
}