Qt5.x-鏈接Sqlite

前言

完成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)載地址,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 4,369評(píng)論 0 5
  • 念頭帶來(lái)巨大的力量,信念不正確很有可能不斷限制自己的發(fā)展。 信念是人對(duì)事物的看法,它是意志力的來(lái)源,和積極主動(dòng)行...
    沐汐瑤閱讀 685評(píng)論 0 51
  • 浩言正語(yǔ)143:最美好的生活方式,不是躺在床上睡到自然醒,也不是坐在家里無(wú)所事事,更不是走在街上隨意購(gòu)物。而是和一...
    永遠(yuǎn)的浩子閱讀 187評(píng)論 0 2

友情鏈接更多精彩內(nèi)容