数据库单例类总结
适用于SQLite
单例模式(使用单个类实现)
为了防止外部的对象对其进行实例化操作=> 构造函数 提高权限为protect private
1.定义静态的类指针 //sql* sql::pSql = NULL; 用于sql类源文件中
2.定义QSqlDatabase类型的静态对象 //QSqlDatabase sql::staticDB; 用于数据库的打开
3.Instance(filename)//返回实例化的数据库
4.CreateTable() //创建/打开user表
//sql.h文件中
class sql
{
public:
sql();
sql(const QString& filename);//打开某个数据库
~sql();
static sql* Instance(const QString &filename); //提供一个共有的静态函数接口//返回实例
//数据库表操作接口
bool CreateTable(); //创建/打开表
//编辑表内容-具体方法
void get_UserInformation(const QString &username);
bool InsertData(QString tablename, QString username, QString pwd);
bool logincheck(QString name, QString pwd);
bool Usernamecheck(QString name);
private:
static sql* pSql;
static QSqlDatabase staticDB;
};
//sql.cpp文件中
sql* sql::pSql = NULL;//数据库对象静态成员初始化(类/对象)
QSqlDatabase sql::staticDB;//(数据库类型的变量)
sql::sql(const QString &filename)
{
//打开/创建 数据库
staticDB = QSqlDatabase::addDatabase("QSQLITE");
staticDB.setDatabaseName(filename);
staticDB.open();
//创建表
if(this->CreateTable())
{
qDebug() << "create table success!";
}
}
sql::~sql()
{
staticDB.close();
}
sql* sql::Instance(const QString &filename)//实例化
{
if(NULL == pSql)//指针为空则实例化(新建)数据库
{
pSql = new sql(filename);
}
return pSql;//返回实例
}
//// 数据库表操作接口 ////
bool sql::CreateTable()//在数据库中创建/打开user表
{
QSqlQuery SqlQuery(staticDB);
//判断表是否存在
QString create_sql = "create table if not exists user(name text,pwd text);";
if(!SqlQuery.exec(create_sql))//.exec()执行成功返回值为1
{
qDebug() << "fail to create table" << SqlQuery.lastError();
return false;
}else
{
qDebug() << "create table success!";
return true;
}
}
///////////// 编辑表内容-具体方法 ///////////////////
bool sql::logincheck(QString name, QString pwd)//登录验证
{
QSqlQuery SqlQuery;
qDebug() << "NAME:" << name;//userNameEdit->text();
qDebug() << "PWD:" << pwd;//pwdEdit->text();
QString select_sql = QString("select * from user where name = '%1' and pwd = '%2';").arg(name).arg(pwd);
if(!SqlQuery.exec(select_sql))
{
qDebug() << "user do not exist!" << SqlQuery.lastError();
return false;
}else
{
qDebug() << "SqlQuery.exec()";
QString username;
QString userpwd;
while(SqlQuery.next())
{
username = SqlQuery.value(1).toString();
userpwd = SqlQuery.value(2).toString();
}
if(username==NULL)
{
return false;
}else
return true;
}
}
bool sql::InsertData(QString tablename, QString username, QString pwd)//插入数据
{
QSqlQuery sqlQuery(staticDB);
QString sql = QString("insert into %1 values('%2','%3')").arg(tablename).arg(username).arg(pwd);
qDebug() << "insert data";
if(!sqlQuery.exec(sql))
{
qDebug()<<"Failed to insert table:"<<sqlQuery.lastError();
}
else
{
qDebug()<<"success to insert";
}
}
实际应用:
1.sql* pusersql; //目标类Register中 public:下添加sql*类指针
2.this->pusersql = sql::Instance("userinfo.db");//目标类构造函数中进行数据库实例化
3.this->pusersql->Usernamecheck(ui->Rname_lineEdit->text().toAscii()); //通过 sql*类指针 调用sql单例类中方法及属性 进行登录验证/添加用户等等操作
//Register.h
class Register : public QWidget
{
Q_OBJECT
public:
explicit Register(QWidget *parent = 0);
~Register();
sql* pusersql; ////添加sql*类指针 -作为成员属性
private slots:
void on_Register_Button_clicked();
};
//Register.cpp
Register::Register(QWidget *parent) :
QWidget(parent)
{
allwidgetpoint::pRegister=this;
this->pusersql = sql::Instance("userinfo.db");//数据库实例化 -在构造函数中
}
void Register::on_Register_Button_clicked()
{
if(this->pusersql->InsertData("user",ui->Rname_lineEdit->text().toAscii(),ui->Rpwd_lineEdit->text().toAscii())) //通过sql*类指针通过调用dql方法
{
QMessageBox::information(this,"tip","Register successful");
}else
{
QMessageBox::information(this,"tip","Register failed");
}
}