1. 程式人生 > >QT5下SQLite的增刪改查示例程式碼

QT5下SQLite的增刪改查示例程式碼

Author: Kagula

Date: 2016-8-10

Envrionment: Qt 5.6

Introduction:

   從專案中抽出來的如何操作sqlite的程式碼,這裡記下,免得時間久忘記了。

測試示例程式碼

void MainWindow::OnAdd()
{
    MySQLiteEscortStaffFingerPrint db;
    std::vector<EscortStaffFingerPrint> vecAdd;
    vecAdd.push_back(EscortStaffFingerPrint("0","0","2","fp","fp-md5"));
    vecAdd.push_back(EscortStaffFingerPrint("1","3","4","fp2","fp2-md5"));
    db.TableAdd(vecAdd);
}

void MainWindow::OnDelete()
{
    std::vector<QString> vecDel;
    vecDel.push_back("0");
    vecDel.push_back("1");

    MySQLiteEscortStaffFingerPrint db;
    db.TableDelete(vecDel);
}

void MainWindow::OnModify()
{
    std::vector<EscortStaffFingerPrint> vecModify;
    vecModify.push_back(EscortStaffFingerPrint("2","23","24","fp22","fp22-md5"));

    MySQLiteEscortStaffFingerPrint db;
    db.TableModify(vecModify);
}


新建資料庫的示例程式碼

標頭檔案

#ifndef MYSQLITE_H
#define MYSQLITE_H

#include <Qtsql/QSqlDatabase>

/*
 * parent class
 * function
 * [1]開啟或新建DB
 * [2]關閉DB
 * */
class MySQLite
{
public:
    MySQLite();
    ~MySQLite();
private:
    QSqlDatabase m_dbconn;
};

#endif // MYSQLITE_H


實現檔案

#include "mysqlite.h"

#include <Qtsql/QSqlQuery>
#include <QDebug>

MySQLite::MySQLite()
{
    m_dbconn = QSqlDatabase::addDatabase("QSQLITE");    //新增SQLite資料庫驅動
    QString fullPath = "mytest.db";
    m_dbconn.setDatabaseName(fullPath);  //在工程目錄新建一個mytest.db的檔案
    if(!m_dbconn.open())    {
        qDebug()<<"open "<<fullPath<<" failed!";
    }
}


MySQLite::~MySQLite()
{
    m_dbconn.close();
}


增刪改查的示例程式碼

標頭檔案

#ifndef MYSQLITEESCORTSTAFFFINGERPRINT_H
#define MYSQLITEESCORTSTAFFFINGERPRINT_H

#include "mysqlite.h"

#include <QString>

#include <vector>

/*
 * [1]不支援執行緒,不建議long life span!
 * [2]class例項化後,使用完畢,應立即釋放。
 * [3]服務端會把modify動作拆成delete,add兩個動作,所以理論上不會有修改現存記錄的動作。
 *    除非使用者直接修改資料庫EscortStaffFingerPrint表記錄。
 * */

struct EscortStaffFingerPrint{
    QString idEscortStaffFingerPrint;
    QString idescortstaff;
    QString fingersequence;
    QString fingerprint;
    QString fingerprintmd5;
    EscortStaffFingerPrint(){}
    EscortStaffFingerPrint(QString idEscortStaffFingerPrint,
                           QString idescortstaff,
                           QString fingersequence,
                           QString fingerprint,
                           QString fingerprintmd5)
    {
        this->idEscortStaffFingerPrint = idEscortStaffFingerPrint;
        this->idescortstaff = idescortstaff;
        this->fingersequence = fingersequence;
        this->fingerprint = fingerprint;
        this->fingerprintmd5=fingerprintmd5;
    }
};

struct EscortStaffFingerPrintSimple{
    QString idEscortStaffFingerPrint;
    QString fingerprintmd5;
};


class MySQLiteEscortStaffFingerPrint:public MySQLite
{
public:
    MySQLiteEscortStaffFingerPrint();

    int m_maxid;

    std::vector<EscortStaffFingerPrintSimple> GetTableInfo();

    void TableQuery(const QString &idescortstaff,
                    const QString &fingersequence,
                    QString &sRegTemplate,QString &sRegTemplate10);
    void TableDelete(std::vector<QString> vecIdEscortStaffFingerPrint);
    void TableAdd(std::vector<EscortStaffFingerPrint> vecAdd);
    void TableModify(std::vector<EscortStaffFingerPrint> vecModify);
};

#endif // MYSQLITEESCORTSTAFFFINGERPRINT_H

實現檔案
#include "mysqliteescortstafffingerprint.h"

#include <QDebug>

#include <QSqlQuery>

MySQLiteEscortStaffFingerPrint::MySQLiteEscortStaffFingerPrint():MySQLite()
{
    m_maxid = 0;

    QSqlQuery query;
    //sql originated from visual paradigm project.
    QString sql="CREATE TABLE EscortStaffFingerPrint (idEscortStaffFingerPrint number(10) NOT NULL, "
                "idescortstaff number(10) NOT NULL, fingersequence number(2) DEFAULT 0 NOT NULL, "
                "fingerprint varchar2(3072) NOT NULL, fingerprintmd5 varchar2(32) NOT NULL);";
    bool success = query.exec(sql);
    if(success){
        qDebug()<<"Create Table Success! \n";
    }else{
        //table is already exist!
        QString sql = "select idEscortStaffFingerPrint from EscortStaffFingerPrint "
                      "order by idEscortStaffFingerPrint desc limit 0,1";
        QSqlQuery sql_query;
        sql_query.prepare(sql);
        if(sql_query.exec())
        {
            if(sql_query.next())
            {
                m_maxid = sql_query.value(0).toInt();
            }
        }
    }
    qDebug()<<"m_maxid="<<m_maxid<<"\n";
}

std::vector<EscortStaffFingerPrintSimple> MySQLiteEscortStaffFingerPrint::GetTableInfo()
{
    std::vector<EscortStaffFingerPrintSimple> vecR;
    if(m_maxid<=0)
        return vecR;

    QString sql = "select idEscortStaffFingerPrint,fingerprintmd5 from EscortStaffFingerPrint "
                  "order by idEscortStaffFingerPrint";

    QSqlQuery sql_query;
    sql_query.prepare(sql);
    if(sql_query.exec())
    {
        while(sql_query.next())
        {
            EscortStaffFingerPrintSimple rec;
            rec.idEscortStaffFingerPrint = sql_query.value(0).toString();
            rec.fingerprintmd5 = sql_query.value(1).toString();

            vecR.push_back(rec);
        }
    }
    return vecR;
}


void MySQLiteEscortStaffFingerPrint::TableDelete(std::vector<QString> vecIdEscortStaffFingerPrint)
{
    for(unsigned int i=0;i<vecIdEscortStaffFingerPrint.size();i++)
    {
        QSqlQuery sql_delete;
        sql_delete.prepare("delete from EscortStaffFingerPrint where idEscortStaffFingerPrint=?");
        int idEscortStaffFingerPrint = vecIdEscortStaffFingerPrint[i].toInt();
        sql_delete.addBindValue(idEscortStaffFingerPrint);
        if(!sql_delete.exec())
        {
            qDebug()<<"delete record ["<<vecIdEscortStaffFingerPrint[i]<<"] in EscortStaffFingerPrint table failed!";
        }
    }
}


void MySQLiteEscortStaffFingerPrint::TableAdd(std::vector<EscortStaffFingerPrint> vecAdd)
{
    for(int i=0;i<vecAdd.size();i++)
    {
        QSqlQuery sql_add;
        sql_add.prepare("insert into EscortStaffFingerPrint values(?,?,?,?,?)");
        sql_add.addBindValue(vecAdd[i].idEscortStaffFingerPrint.toInt());
        sql_add.addBindValue(vecAdd[i].idescortstaff.toInt());
        sql_add.addBindValue(vecAdd[i].fingersequence.toInt());
        sql_add.addBindValue(vecAdd[i].fingerprint);
        sql_add.addBindValue(vecAdd[i].fingerprintmd5);
        if(!sql_add.exec())
        {
            qDebug()<<"insert record ["<<vecAdd[i].idEscortStaffFingerPrint<<"] in EscortStaffFingerPrint table failed!";
        }
    }
}

void MySQLiteEscortStaffFingerPrint::TableModify(std::vector<EscortStaffFingerPrint> vecModify)
{
    for(int i=0;i<vecModify.size();i++)
    {
        QSqlQuery sql_modify;
        sql_modify.prepare("update EscortStaffFingerPrint set idescortstaff=?,"
                           "fingersequence=?,fingerprint=?,fingerprintmd5=?"
                           " where idEscortStaffFingerPrint=?");
        sql_modify.addBindValue(vecModify[i].idescortstaff.toInt());
        sql_modify.addBindValue(vecModify[i].fingersequence.toInt());
        sql_modify.addBindValue(vecModify[i].fingerprint);
        sql_modify.addBindValue(vecModify[i].fingerprintmd5);

        sql_modify.addBindValue(vecModify[i].idEscortStaffFingerPrint.toInt());
        if(!sql_modify.exec())
        {
            qDebug()<<"modify record ["<<vecModify[i].idEscortStaffFingerPrint<<"] in EscortStaffFingerPrint table failed!";
        }//end if
    }//end for
}//end function

void MySQLiteEscortStaffFingerPrint::TableQuery(const QString &idescortstaff,
                                                const QString &fingersequence,
                                                QString &sRegTemplate,QString &sRegTemplate10)
{
    std::vector<EscortStaffFingerPrintSimple> vecR;
    if(m_maxid<=0)
        return;

    QString sql = "select fingerprint from EscortStaffFingerPrint "
                  "where idescortstaff=? and fingersequence=?";

    QSqlQuery sql_query;
    sql_query.prepare(sql);
    sql_query.bindValue(0,idescortstaff.toInt());
    sql_query.bindValue(1,fingersequence.toInt());
    if(sql_query.exec())
    {
        if(sql_query.next())
        {
            QString fingerPrint = sql_query.value(0).toString();
            QStringList Str_List = fingerPrint.split(",");
            if(Str_List.size()==2)
            {
                sRegTemplate = Str_List[0];
                sRegTemplate10 = Str_List[1];
            }
        }
    }//end if
}//end function


附: .pro檔案片段

QT       += core gui printsupport axcontainer sql