单例模式只创建一个对象,用于一些只需要创建一个对象的类,例如,本文以数据库为例,演示数据库打开的单例模式。
单例是为了实现该类只能创建一个对象,所以我们选择在构造函数中创建对象,保证只能创建唯一的对象。因为对象只有一个,外部不能再创建对象了,所以我们选择通过将构造函数放在私有区中用来创建其唯一的对象,这样可以避免多次创建对象。
.h文件
确定使用构造函数创建对象后,先打开一个数据库。
#include "qdatasqlite.h"
QDataSqlite* QDataSqlite::pIntentce = nullptr;//初始化静态成员
QDataSqlite::QDataSqlite()
{
//打开数据库
this->myDB = nullptr;
int res = sqlite3_open("Data/video.DB",&this->myDB);
if(res == SQLITE_OK)//打开成功
{
qDebug()<< "Open Success";
}
else
{
qDebug()<< sqlite3_errcode(this->myDB);//获取错误代码
qDebug()<< sqlite3_errmsg(this->myDB);//获取错误信息
}
}
发现sqlite3_open()函数需要一个指针变量来保存数据库地址,而在函数内定义的变量是局部的,所以选择将这个指针变量作为类的一个数据成员进行保存。
数据库打开后,还需要有一个能在任意地方访问的方法,所以需要封装一个静态的getSQLite()函数访问数据库对象,且在这里需要进行判断,这个对象的指针是不是空地址,如果是则调用类内的构造函数进行数据库打开 *** 作。(由于静态成员函数只能访问类的静态成员,所以这里的pIntentce也是静态的)
QDataSqlite* QDataSqlite::getSQLite()
{
//增加判断,如果没有这个数据库对象就创建一个
if (QDataSqlite::pIntentce == nullptr)
{
QDataSqlite::pIntentce = new QDataSqlite();
}
return QDataSqlite::pIntentce;
}
有了获取数据库对象的方法后,还需要有 *** 作的数据库方法,这里使用了两个函数做两类 *** 作,分别是sqlite3_exec()做增删改 *** 作、sqlite3_get_table()做查 *** 作。
首先是sqlite3_exec()做增删改 *** 作,我们知道sqlite3_exec()函数可以做多次 *** 作,比较快捷,但返回数据需要多次调用回调函数,是比较麻烦的,所以我们将不需要返回数据的 *** 作交由其处理,并将一些定义变量等 *** 作,封装一个成noResult()函数,减少代码冗余。sqlite3_get_table()同理。
int QDataSqlite::noResult(const char *sql)
{
char* errorMsg = nullptr;
int res = sqlite3_exec(this->myDB,sql,nullptr,nullptr,&errorMsg);
return res;
}
int QDataSqlite::getResult(const char *sql, char**& qresult, int& row, int& col)
{
char* errorMsg = nullptr;
int res = sqlite3_get_table(myDB, sql, &qresult, &row, &col, &errorMsg);
if(res == SQLITE_OK)//查询成功
{
qDebug()<< "Check Success";
return 0;
}
else
{
if (row == 0)
{
return -1;
}
else
{
return res;
}
}
}
调用时,只需通过静态方法QDataSqlite::getSQLite()获取到数据库即可
void Widget::judge()
{
//先判断是否为空
if(this->PhoneEdit->text().isEmpty() || this->pswdEdit->text().isEmpty())
{//为空
QMessageBox::warning(this,"QQ","用户信息为空","确认");//用户信息为空d窗
this->PhoneEdit->clear();
this->pswdEdit->clear();
emit this->show();//发送重新登陆信号
}
else//不为空,查找ID
{
//查询user_id用户信息
bool ok = true;
char** result;
int res_Login = 0, row = 0, col = 0;
QString sql_Login = QString("SELECT * FROM Tbl_user WHERE user_phone = %1 AND user_pwd = '%2';")
.arg(this->PhoneEdit->text().toLongLong(&ok,10)).arg(this->pswdEdit->text());
res_Login = QDataSqlite::getSQLite()->getResult(sql_Login.toStdString().c_str(),result,row,col);
if(row != 0)//查询到了
{
QMessageBox::information(this,"QQ","登陆成功","确认");
this->PhoneEdit->clear();
this->pswdEdit->clear();
emit loginSignal();//发送角色信息信号
this->close();//关闭登陆界面
}
else if(row == 0)//说明没有此账号
{//d窗
QMessageBox::warning(this,"QQ","用户名或密码错误","确认");//没有此账号d窗
this->PhoneEdit->clear();
this->pswdEdit->clear();
emit this->show();//发送重新登陆信号
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)