Qt中单例模式打开SQLite3数据库的实现思路

Qt中单例模式打开SQLite3数据库的实现思路,第1张

        单例模式只创建一个对象,用于一些只需要创建一个对象的类,例如,本文以数据库为例,演示数据库打开的单例模式。

        单例是为了实现该类只能创建一个对象,所以我们选择在构造函数中创建对象,保证只能创建唯一的对象。因为对象只有一个,外部不能再创建对象了,所以我们选择通过将构造函数放在私有区中用来创建其唯一的对象,这样可以避免多次创建对象。

.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();//发送重新登陆信号
        }
    }
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1331150.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存