目录
本次没有完成好,程序异常结束(我也不知道为啥),没有进入getUserModelByUserName函数中,下次有时间回来看看。
![](/qrcode.jpg)
一:单例模式适应范围
单例模式可以保证:在一个应用程序中,一个类有且只有一个实例,
并提供一个访问它的全局访问点。
在程序设计过程中,有很多情况需要确保一个类只有一个实例。
二:单例模式优缺点
优点:该实现是一个"懒汉"单例模式,意味着只有在第一次调用GetInstance()
静态方法的时候才进行内存分配。如果整个程序不调用该静态方法,则
不会分配内存。相对应的是"饿汉"单例模式。
缺点:1."懒汉"模式虽然有优点,但是每次调用GetInstance()静态方法时,必须判断
NULL == m_instance,使程序相对开销增大。
2.由于使用指针动态内存分配,我们必须在程序结束时,手动的调用ReleaseInst
ance()静态方法,进行内存的释放。
3. 教科书标准实现最大的缺点是线程不安全。根据该模式的定义,整个应用程序
中,不管是单线程,还是多线程,都只能有且只有该类的一个实例。而在多线
程中会导致多个实例的产生,从而导致运行代码不正确以及内存的泄露。
三:MVC设计模式
MVC的英文全称为Model-View-Controller,即把一个信息系统的应用按照模型(Model)、视图(View)、控制器(Controller)的方式进行分离,这样一个应用就被分成三层:模型层、视图层和控制层。
通过视图层去操作控制器(将数据信息传输给控制器),由控制器去找到对应的模型,在模型中去访问数据库,数据库返回出来的结果通过模型返回给控制器,再将控制器中的数据返回给视图层 。
四:MVC设计核心代码
4.1 mysqlite.h .cpp---数据库
#ifndef MYSQLITE_H
#define MYSQLITE_H
#include"sqlite3.h"
#include<QString>//定义用户名密码
class mySqlite
{
public:
static mySqlite *getInstance(char *dataBaseName);//公有的静态的获取类对象指针的方法
static void createUserTable(char *tableName);//建表
static int getData(const char *sql,char **&result,int &row,int &col);
sqlite3 *getAppDataBase();//获取数据库对象
private:
mySqlite(char *dataBaseName);//构造函数私有化
~mySqlite();
static mySqlite *PdataBase;//私有的静态的类对象指针
sqlite3 *appDataBase;//数据库指针
};
#endif // MYSQLITE_H
#include "mysqlite.h"
#include<QDebug>
mySqlite *mySqlite::PdataBase = nullptr;//类对象指针
mySqlite *mySqlite::getInstance(char *dataBaseName)
{
if(mySqlite::PdataBase == nullptr)
{
mySqlite::PdataBase = new mySqlite(dataBaseName);
}
return mySqlite::PdataBase;
}
void mySqlite::createUserTable(char *tableName)
{
char *zErrMsg = 0;
QString createTablesql=QString("CREATE TABLE if not exists %1(\
userID integer primary key autoincrement,\
userName text not null,\
userPasswd text not null\
);").arg(tableName);
int rc=sqlite3_exec(PdataBase->appDataBase, createTablesql.toStdString().c_str(), nullptr, 0, &zErrMsg);
if( rc != SQLITE_OK )
{
qDebug()<<zErrMsg;
qDebug()<<createTablesql;
}
else
{
qDebug()<<tableName<<"table created successfully!";
}
}
int mySqlite::getData(const char *sql, char **&result, int &row, int &col)
{
char *errmsg = 0;
int ret = sqlite3_get_table(PdataBase->appDataBase,sql,&result,&row,&col,&errmsg);
if(ret != SQLITE_OK)
{
qDebug()<<sqlite3_errmsg(PdataBase->appDataBase);
qDebug()<<sqlite3_errcode(PdataBase->appDataBase);
}
return 0;
}
sqlite3 *mySqlite::getAppDataBase()
{
return this->appDataBase;
}
mySqlite::mySqlite(char *dataBaseName)
{
//打开数据库
int ret = sqlite3_open(dataBaseName,&appDataBase);//数据库不存在自动创建
if(ret)
{
qDebug()<<"Can't open DataBase";
qDebug()<<sqlite3_errmsg(appDataBase);
exit(0);
}
else
{
qDebug()<<"Open"<<dataBaseName<<"successfully!";
}
}
mySqlite::~mySqlite()
{
//关闭数据库
sqlite3_close(appDataBase);
}
4.2 widget.h .cpp---视图层
#include"mycontroller.h"
//视图层中定义控制器
myController *pusercontroller;
void Widget::goLoginSlot()
{
qDebug()<<"点击登录";//测试
//获取 编辑框内容
//获取输入的用户名
QString username = userEdit->text();
//qDebug()<<username; //测试
//获取输入的密码
QString userpwd = pwdEdit->text();
//视图层
int ret1 = pusercontroller->findUserModelByUserName(username);
if(ret1 == 0)
{
qDebug()<<"登录成功";
}
else
{
qDebug()<<"登录失败";
}
}
4.3 mycontroller.h .cpp---控制层
#ifndef MYCONTROLLER_H
#define MYCONTROLLER_H
#include<QString>
#include"mymodel.h"
class myController
{
public:
//静态的公有的获取类对象指针的方法
static myController*getIntance();
//控制器->模型
int findUserModelByUserName(QString username);
private:
//构造函数私有化
myController();
//定义一个静态的类对象指针
static myController*pmyController;
//定义一个模型对象
myModel *pusermodel;
};
#endif // MYCONTROLLER_H
#include "mycontroller.h"
#include<QDebug>
myController*myController::pmyController = nullptr;
myController *myController::getIntance()
{
if(myController::pmyController == nullptr)
{
myController::pmyController = new myController;
}
return myController::pmyController;
}
int myController::findUserModelByUserName(QString username)
{
qDebug()<<"findUserModelByUserName";
//通过用户名查找数据库里的内容
return pusermodel->getUserModelByUserName(username);
}
myController::myController()
{
pusermodel = myModel::getIntance();
}
4.4 mymodel.h .cpp---模型层
#ifndef MYMODEL_H
#define MYMODEL_H
#include"mysqlite.h"
#include<QString>
class myModel
{
public:
//静态公有获取类对象指针的方法 模型--get方法
static myModel*getIntance();
int getUserModelByUserName(QString username);
private:
//构造函数私有化
myModel();
//静态私有的类对象指针
static myModel*pmyModel;
//数据库对象
mySqlite *appdb;
};
#endif // MYMODEL_H
#include "mymodel.h"
#include<QDebug>
myModel*myModel::pmyModel = nullptr;
myModel *myModel::getIntance()
{
if(myModel::pmyModel == nullptr)
{
myModel::pmyModel = new myModel;
}
return myModel::pmyModel;
}
int myModel::getUserModelByUserName(QString username)
{
qDebug()<<"getUserModelByUserName";
//模型操作数据库
char **result = nullptr;
int nRow = 0;
int nCol = 0;
QString selectUser = QString("select userName from user where userName = '%1'").arg(username);
int ret = mySqlite::getData(selectUser.toLatin1(),result,nRow,nCol);
if(ret ==0)
{
qDebug()<<"nRow"<<nRow;
if(nRow == 0)
{
qDebug()<<"该用户不存在";
}
else
{
qDebug()<<"该用户存在";
return 0;
}
}
else
{
return -1;
}
}
myModel::myModel()
{
//获取数据库对象指针
appdb = mySqlite::getInstance("app.db");
}
4.5 实现结果:视图中不进行数据库的相关操作
本次没有完成好,程序异常结束(我也不知道为啥),没有进入getUserModelByUserName函数中,下次有时间回来看看。
解决:
方法一:
方法二: