前言
完成Qt的基礎(chǔ)語(yǔ)法學(xué)習(xí)后,嘗試跟著教程完成了翻金幣小游戲,但在實(shí)際使用Qt的過(guò)程中,會(huì)遇到保存數(shù)據(jù)的需求,經(jīng)過(guò)查找,確定使用SQLite數(shù)據(jù)庫(kù)作為練習(xí)數(shù)據(jù)庫(kù),SQLite版本選擇的是版本SQLite3.0
目標(biāo)
1.鏈接SQLite3.0數(shù)據(jù)庫(kù),完成初始化鏈接,測(cè)試如果首次鏈接完成后,第二次啟動(dòng)程序如何與現(xiàn)有數(shù)據(jù)庫(kù)鏈接;
2.鏈接完成初始化數(shù)據(jù)庫(kù),完成基礎(chǔ)表的創(chuàng)建和數(shù)據(jù)插入,完成一個(gè)登陸功能的數(shù)據(jù)初始化工作;
3.對(duì)數(shù)據(jù)庫(kù)使用工具進(jìn)行封裝,提供工具包完成日常數(shù)據(jù)庫(kù)訪問(wèn)的操作;
4.使用工具類(lèi)提供的方法完成登陸按鈕點(diǎn)擊后的操作。
鏈接數(shù)據(jù)庫(kù)
- 根據(jù)Qt的幫助文檔,Qt自帶SQL的操作,但是在使用SQL前需要在*.pro文件中添加QT += sql
//一個(gè)contains判斷,如果之前建立了連接,我們就獲取連接到的數(shù)據(jù)庫(kù),如果沒(méi)有建立連接,我們就新建一個(gè)數(shù)據(jù)庫(kù)
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");
//打開(kāi)數(shù)據(jù)庫(kù)
if (!m_db.open())
{
qDebug() << "Open database failed!";
return false;
}
else
{
return true;
}
三目運(yùn)算僅是出于代碼的邏輯性編寫(xiě),先判斷是否有鏈接然后直接設(shè)置和新建設(shè)置,也可以直接使用QSqlDatabase::addDatabase("QSQLITE");
如果想選用現(xiàn)有數(shù)據(jù)庫(kù)文件,經(jīng)過(guò)我自己的實(shí)驗(yàn),有兩種方法:
- m_db.setDatabaseName("strConn");中,參數(shù)填寫(xiě)的絕對(duì)路徑;
- 需要進(jìn)行文件選擇操作,完成Qt的文件選擇功能,然后選擇現(xiàn)有數(shù)據(jù)庫(kù)文件,通過(guò)QFile復(fù)制一份到程序位置,然后返回絕對(duì)路徑填寫(xiě)至m_db.setDatabaseName("strConn");中
是否有更好的處理方法,暫時(shí)沒(méi)有想到,由于只設(shè)計(jì)一個(gè)登陸功能,所以使用Qt中直接創(chuàng)建數(shù)據(jù)庫(kù)文件,生成數(shù)據(jù)庫(kù)表和數(shù)據(jù)的方式。
生成默認(rèn)表和數(shù)據(jù)
//判定是否需要進(jìn)行初始化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;
- 一個(gè)登陸功能,需要的就是一張用戶(hù)表,有用戶(hù)名和密碼兩個(gè)字?jǐn)啵?/li>
- 按照程序邏輯的健壯性,先進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)是否已經(jīng)創(chuàng)建了本表,如果有表則不進(jìn)行表的創(chuàng)建直接返回;
- 如果沒(méi)有用戶(hù)表,在進(jìn)行用戶(hù)表創(chuàng)建后,直接向表中插入一條用戶(hù)數(shù)據(jù)完成初始化的工作;
封裝日常使用Qt與SQLlie3進(jìn)行交互的工具類(lèi)
- 把創(chuàng)建數(shù)據(jù)庫(kù)鏈接和完成數(shù)據(jù)初始化的工作都放到工具類(lèi)的初始化方法;
- 創(chuàng)建數(shù)據(jù)庫(kù)鏈接和完成數(shù)據(jù)初始化都有已有文件和數(shù)據(jù)庫(kù)表的校驗(yàn)
- 在Qt提供的數(shù)據(jù)庫(kù)操作上多進(jìn)行了一層封裝,可在登陸功能時(shí)直接使用
- 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();
?
//數(shù)據(jù)庫(kù)鏈接信息
bool createConnection(const QString& strConn);
//初始化所需的數(shù)據(jù)表
//base_config 初始化配置表
//base_user 用戶(hù)表
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);
//初始化數(shù)據(jù)
init_table_data();
}
?
//析構(gòu)函數(shù)關(guān)閉數(shù)據(jù)庫(kù)鏈接
DbUtilBySqlite3::~DbUtilBySqlite3()
{
m_db.close();
}
?
bool DbUtilBySqlite3::createConnection(const QString &strConn)
{
//一個(gè)contains判斷,如果之前建立了連接,我們就獲取連接到的數(shù)據(jù)庫(kù),如果沒(méi)有建立連接,我們就新建一個(gè)數(shù)據(jù)庫(kù)
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");
//打開(kāi)數(shù)據(jù)庫(kù)
if (!m_db.open())
{
qDebug() << "Open database failed!";
return false;
}
else
{
return true;
}
}
?
bool DbUtilBySqlite3::init_table_data()
{
//判定是否需要進(jìn)行初始化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);
}
登陸的信號(hào)槽
//登陸按鈕點(diǎn)擊
connect(ui->btn_login, &QPushButton::clicked, [=](){
QString con_username = ui->edit_username->text();
QString con_password = ui->edit_password->text();
//校驗(yàn)填入的參數(shù)
if(con_username.length() <= 3 || con_password.length() <= 3)
{
QMessageBox::critical(NULL, "填寫(xiě)錯(cuò)誤", "賬號(hào)或密碼太短");
}else
{
//封裝查詢(xún)登陸
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;
}
}
?
//登陸成功跳轉(zhuǎn)到主頁(yè)面,登陸失敗進(jìn)行提示
if(loginFlag){
this->hide();
m = new MainWindow(this);
m->show();
}
else
{
QApplication::setQuitOnLastWindowClosed(false);
QMessageBox::critical(NULL, "登陸失敗", "賬號(hào)或密碼錯(cuò)誤");
QApplication::setQuitOnLastWindowClosed(true);
}
}
});
轉(zhuǎn)載請(qǐng)注明轉(zhuǎn)載地址,謝謝