栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

.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","用户信息为空","确认");//用户信息为空弹窗
        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)//说明没有此账号
        {//弹窗
            QMessageBox::warning(this,"QQ","用户名或密码错误","确认");//没有此账号弹窗
            this->PhoneEdit->clear();
            this->pswdEdit->clear();
            emit this->show();//发送重新登陆信号
        }
    }
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/958152.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号