前言
完成Qt的基础语法学习后,尝试跟着教程完成了翻金币小游戏,但在实际使用Qt的过程中,会遇到保存数据的需求,经过查找,确定使用SQLite数据库作为练习数据库,SQLite版本选择的是版本SQLite3.0
目标
1.链接SQLite3.0数据库,完成初始化链接,测试如果首次链接完成后,第二次启动程序如何与现有数据库链接;
2.链接完成初始化数据库,完成基础表的创建和数据插入,完成一个登陆功能的数据初始化工作;
3.对数据库使用工具进行封装,提供工具包完成日常数据库访问的操作;
4.使用工具类提供的方法完成登陆按钮点击后的操作。
链接数据库
- 根据Qt的帮助文档,Qt自带SQL的操作,但是在使用SQL前需要在*.pro文件中添加QT += sql
//一个contains判断,如果之前建立了连接,我们就获取连接到的数据库,如果没有建立连接,我们就新建一个数据库
m_db=QSqlDatabase::contains("qt_sql_default_connection")? QSqlDatabase::database("qt_sql_default_connection"):QSqlDatabase::addDatabase("QSQLITE", "qt_sql_default_connection");
m_db.setDatabaseName("strConn");
m_db.setUserName("admin");
m_db.setPassword("123456");
//打开数据库
if (!m_db.open())
{
qDebug() << "Open database failed!";
return false;
}
else
{
return true;
}
三目运算仅是出于代码的逻辑性编写,先判断是否有链接然后直接设置和新建设置,也可以直接使用QSqlDatabase::addDatabase("QSQLITE");
如果想选用现有数据库文件,经过我自己的实验,有两种方法:
- m_db.setDatabaseName("strConn");中,参数填写的绝对路径;
- 需要进行文件选择操作,完成Qt的文件选择功能,然后选择现有数据库文件,通过QFile复制一份到程序位置,然后返回绝对路径填写至m_db.setDatabaseName("strConn");中
是否有更好的处理方法,暂时没有想到,由于只设计一个登陆功能,所以使用Qt中直接创建数据库文件,生成数据库表和数据的方式。
生成默认表和数据
//判定是否需要进行初始化base_config和base_user两张表
int isInitFlag = ExecuteInt(QString ("select count(*) from sqlite_master where type='table' and name = 'base_config'"));
if(isInitFlag == 0)
{
QString user_createStr = QString("create table base_user(id INTEGER PRIMARY KEY AUTOINCREMENT ,username varchar(20),password varchar(20))");
QString user_insertStr = QString("insert into base_user values %1").arg("(NULL, 'admin', 'admin')");
ExecuteString(user_createStr);
ExecuteString(user_insertStr);
}
return true;
- 一个登陆功能,需要的就是一张用户表,有用户名和密码两个字断;
- 按照程序逻辑的健壮性,先进行数据库查询是否已经创建了本表,如果有表则不进行表的创建直接返回;
- 如果没有用户表,在进行用户表创建后,直接向表中插入一条用户数据完成初始化的工作;
封装日常使用Qt与SQLlie3进行交互的工具类
- 把创建数据库链接和完成数据初始化的工作都放到工具类的初始化方法;
- 创建数据库链接和完成数据初始化都有已有文件和数据库表的校验
- 在Qt提供的数据库操作上多进行了一层封装,可在登陆功能时直接使用
- DbUtilBySqlite3.h
#ifndef DBUTILBYSQLITE3_H
#define DBUTILBYSQLITE3_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQueryModel>
class DbUtilBySqlite3 : public QObject
{
Q_OBJECT
public:
explicit DbUtilBySqlite3(const QString& strDatabase = "smart.db");
~DbUtilBySqlite3();
//数据库链接信息
bool createConnection(const QString& strConn);
//初始化所需的数据表
//base_config 初始化配置表
//base_user 用户表
bool init_table_data();
QSqlRecord ExecuteRecord(const QString& strQuery);
QSqlRecord ExecuteRecord(const QString& strQuery, QList<QVariant> lstParameter);
QSqlRecord ExecuteRecord(const QString& strQuery, QVariant Parameter);
QSqlQuery ExecuteSqlQuery(const QString& strQuery, QList<QVariant> lstParameter);
QSqlQuery ExecuteSqlQuery(const QString& strQuery, QVariant Parameter);
QSqlQuery ExecuteSqlQuery(const QString& strQuery);
int ExecuteInt(const QString& strQuery);
int ExecuteInt(const QString& strQuery, QList<QVariant> lstParameter);
int ExecuteInt(const QString& strQuery, QVariant Parameter);
bool Execute(const QString& strQuery, QVariant Parameter);
bool Execute(const QString& strQuery, QList<QVariant> lstParameter);
QString ExecuteString(const QString& strQuery);
void ExecuteQueryModel(QSqlQueryModel *p_queryModel, const QString& strQuery);
void ExecuteQueryModel(QSqlQueryModel *p_queryModel, const QString& strQuery,
QList<QVariant> lstParameter);
void ExecuteQueryModel(QSqlQueryModel *p_queryModel, const QString& strQuery, QVariant Parameter);
private:
QSqlDatabase m_db;
QString m_strDatabase;
signals:
};
#endif // DBUTILBYSQLITE3_H
- DbUtilBySqlite3.cpp
#include "dbutilbysqlite3.h"
#include<QSqlDatabase>
#include<QSqlQuery>
#include<QSqlError>
#include<QDebug>
#include<QSqlRecord>
DbUtilBySqlite3::DbUtilBySqlite3(const QString &strDatabase) : m_strDatabase(strDatabase)
{
createConnection(m_strDatabase);
//初始化数据
init_table_data();
}
//析构函数关闭数据库链接
DbUtilBySqlite3::~DbUtilBySqlite3()
{
m_db.close();
}
bool DbUtilBySqlite3::createConnection(const QString &strConn)
{
//一个contains判断,如果之前建立了连接,我们就获取连接到的数据库,如果没有建立连接,我们就新建一个数据库
m_db=QSqlDatabase::contains("qt_sql_default_connection")?QSqlDatabase::database("qt_sql_default_connection")
:QSqlDatabase::addDatabase("QSQLITE", "qt_sql_default_connection");
m_db.setDatabaseName(strConn);
m_db.setUserName("admin");
m_db.setPassword("123456");
//打开数据库
if (!m_db.open())
{
qDebug() << "Open database failed!";
return false;
}
else
{
return true;
}
}
bool DbUtilBySqlite3::init_table_data()
{
//判定是否需要进行初始化base_user表
int isInitFlag = ExecuteInt(QString ("select count(*) from sqlite_master where type='table' and name = 'base_config'"));
if(isInitFlag == 0)
{
QString user_createStr = QString("create table base_user(id INTEGER PRIMARY KEY AUTOINCREMENT ,username varchar(20),password varchar(20))");
QString user_insertStr = QString("insert into base_user values %1").arg("(NULL, 'admin', 'admin')");
ExecuteString(user_createStr);
ExecuteString(user_insertStr);
}
return true;
}
QSqlRecord DbUtilBySqlite3::ExecuteRecord(const QString& strQuery)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
query.exec();
return query.record();
}
QSqlRecord DbUtilBySqlite3::ExecuteRecord(const QString& strQuery, QList<QVariant> lstParameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
for(int i = 0; i < lstParameter.count(); I++)
query.bindValue(i, lstParameter[I]);
query.exec();
return query.record();
}
QSqlRecord DbUtilBySqlite3::ExecuteRecord(const QString& strQuery, QVariant Parameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
query.bindValue(0, Parameter);
query.exec();
return query.record();
}
QSqlQuery DbUtilBySqlite3::ExecuteSqlQuery(const QString& strQuery, QList<QVariant> lstParameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
query.setForwardOnly(true);
for(int i = 0; i < lstParameter.count(); I++)
query.bindValue(i, lstParameter[I]);
query.exec();
return query;
}
QSqlQuery DbUtilBySqlite3::ExecuteSqlQuery(const QString& strQuery, QVariant Parameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.setForwardOnly(true);
query.prepare(strQuery);
query.bindValue(0, Parameter);
query.exec();
return query;
}
QSqlQuery DbUtilBySqlite3::ExecuteSqlQuery(const QString& strQuery)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.setForwardOnly(true);
query.prepare(strQuery);
query.exec();
return query;
}
int DbUtilBySqlite3::ExecuteInt(const QString& strQuery)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
query.exec();
int ID = 0;
while(query.next())
{
ID = query.value(0).toInt();
}
return ID;
}
int DbUtilBySqlite3::ExecuteInt(const QString& strQuery, QList<QVariant> lstParameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
for(int i = 0; i < lstParameter.count(); I++)
query.bindValue(i, lstParameter[I]);
query.exec();
int ID = 0;
while(query.next())
{
ID = query.value(0).toInt();
}
return ID;
}
int DbUtilBySqlite3::ExecuteInt(const QString& strQuery, QVariant Parameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
query.bindValue(0, Parameter);
query.exec();
int ID = 0;
while(query.next())
{
ID = query.value(0).toInt();
}
return ID;
}
bool DbUtilBySqlite3::Execute(const QString& strQuery, QVariant Parameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
query.bindValue(0, Parameter);
return query.exec();
}
bool DbUtilBySqlite3::Execute(const QString& strQuery, QList<QVariant> lstParameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
for(int i = 0; i < lstParameter.count(); I++)
query.bindValue(i, lstParameter[I]);
return query.exec();
}
QString DbUtilBySqlite3::ExecuteString(const QString& strQuery)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
query.exec();
QString temp;
while(query.next())
{
temp = query.value(0).toString();
}
return temp;
}
void DbUtilBySqlite3::ExecuteQueryModel(QSqlQueryModel *p_queryModel, const QString& strQuery)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
p_queryModel->setQuery(strQuery, m_db);
}
void DbUtilBySqlite3::ExecuteQueryModel(QSqlQueryModel *p_queryModel, const QString& strQuery,
QList<QVariant> lstParameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
for(int i = 0; i < lstParameter.count(); I++)
query.bindValue(i, lstParameter[I]);
p_queryModel->setQuery(query);
}
void DbUtilBySqlite3::ExecuteQueryModel(QSqlQueryModel *p_queryModel, const QString& strQuery,
QVariant Parameter)
{
if(!m_db.isOpen())
{
createConnection(m_strDatabase);
}
QSqlQuery query(m_db);
query.prepare(strQuery);
query.bindValue(0, Parameter);
p_queryModel->setQuery(query);
}
登陆的信号槽
//登陆按钮点击
connect(ui->btn_login, &QPushButton::clicked, [=](){
QString con_username = ui->edit_username->text();
QString con_password = ui->edit_password->text();
//校验填入的参数
if(con_username.length() <= 3 || con_password.length() <= 3)
{
QMessageBox::critical(NULL, "填写错误", "账号或密码太短");
}else
{
//封装查询登陆
QString str_select = QString("SELECT * FROM base_user WHERE username = ? AND password = ? AND id = 1");
QVariant username(con_username);
QVariant password(con_password);
QList<QVariant> lstParameter;
lstParameter.append(username);
lstParameter.append(password);
QSqlQuery query = dbUtil.ExecuteSqlQuery(str_select, lstParameter);
bool loginFlag = false;
while(query.next())
{
if(query.value(1).toString() == con_username && query.value(2).toString() == con_password)
{
loginFlag = true;
break;
}
}
//登陆成功跳转到主页面,登陆失败进行提示
if(loginFlag){
this->hide();
m = new MainWindow(this);
m->show();
}
else
{
QApplication::setQuitOnLastWindowClosed(false);
QMessageBox::critical(NULL, "登陆失败", "账号或密码错误");
QApplication::setQuitOnLastWindowClosed(true);
}
}
});
转载请注明转载地址,谢谢