欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt5.0行车记录仪项目(一)SQL数据库建立

程序员文章站 2022-04-19 18:44:42
...

一、 数据库表结构

用户数据表与文件路径表设计如下,此外还会新增一个用户设置信息表,设置信息表保存用户账户,设置的图片文件保存路径,视频文件保存路径与录制时间
Qt5.0行车记录仪项目(一)SQL数据库建立

二、Qt数据库单例类

1、什么是单例类?
首先理解一下什么是单例模式。单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例;简单定义为保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2、如何创建单例模式类?
单例类必须要有一个 private 访问级别的构造函数,只有这样,才能确保单例不会在系统中的其他代码内被实例化;
为满足以上条件,需要做的事情很简单:第一步,将构造函数设置为私有,不让在其它地方可以创建实例;第二步,创建一个公有静态函数接口,在接口中创建类的实例并返回;这样一来,在其它类里面要调用单例类的函数的话,就可以通过调用静态函数拿到类的示例然后再调用类的其它公有函数。
内容参考: https://blog.csdn.net/qq_34337272/.
https://blog.csdn.net/qq_36403434/.

代码实现如下
1、在Qt的pro文件中加上

QT       += sql

2、.h文件代码

#ifndef SQLDATA_H
#define SQLDATA_H

#include <QString>
#include <QSqlDatabase>

class SqlData
{
public:
    static SqlData *getDB(const QString &filename);    
    void openDB(const QString &filename);
    void closeDB();
    void initUsertable();      //初始化用户数据表
    void initSourcetable();    //初始化文件资源数据表
    void initSettingTable();    //初始化设置信息数据表

    bool creatPath(const QString filePath);     //创建路径
    bool loginCheck(QString ID,QString Pwd);   //检车登录用户
    bool registCheck(QString ID, QString Name, QString Pwd);   //注册检测
    bool searchUser(QString ID);   //查找用户
    bool insertSourcetable(QString uId, QString date, QString type, QString path);     //文件资源表插入数据
    int checkSettingTable(QString uId);     //检测设置信息数据表
    bool insertSettingTable(QString uId, QString imgpath, QString videopath, QString time);     //插入设置信息数据表
    bool updateSettingTable(QString uId, QString imgpath, QString videopath, QString time);     //更新设置信息数据表

private:
    SqlData(const QString &filename);   //初始化函数私有
    static SqlData *pSqlData;
    QSqlDatabase pSqlDatabase;
};

#endif // SQLDATA_H

3、.c文件代码

#include "sqldata.h"
#include "allwidget.h"	//窗口管理
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
#include <QSqlQuery>    //提供了数据库执行和操作的方法
#include <QMessageBox>
#include <QDir>

SqlData *SqlData::pSqlData = NULL;

SqlData::SqlData(const QString &filename)
{
    this->openDB(filename);
}
//公有静态函数接口,在接口中创建类的实例并返回
SqlData *SqlData::getDB(const QString &filename)
{
    if(NULL == pSqlData)
    {
        pSqlData = new SqlData(filename);
    }
    return pSqlData;
}

void SqlData::openDB(const QString &filename)
{
    //添加数据库驱动
    pSqlDatabase = QSqlDatabase::addDatabase("QSQLITE");
    pSqlDatabase.setDatabaseName(filename.toStdString().c_str());
    //使用数据库驱动 去调用DDL语句
    //打开数据库
    if(!pSqlDatabase.open())
    {
        qDebug() << pSqlDatabase.lastError();
    }
    else
    {
        initUsertable();
        initSourcetable();
        initSettingTable();
    }
}
//关闭数据库
void SqlData::closeDB()
{
    pSqlDatabase.close();
}

void SqlData::initUsertable()
{
    QSqlQuery pSqlQuery;
    //QString drop_sql = "drop table user;";
    QString create_sql = "create table usr(uId VARCHAR primary key,uName VARCHAR,pwd VARCHAR,state INT);";
    //QString select_sql = "select *from usr;";

    pSqlQuery.prepare(create_sql);
    if(!pSqlQuery.exec()){
        qDebug() << pSqlQuery.lastError();
    }
    else{
        qDebug() << "usr table create";
    }
}

void SqlData::initSourcetable()
{
    QSqlQuery pSqlQuery;
    //QString drop_sql = "drop table source;";
    QString create_sql = "create table source(id INTEGER primary key AUTOINCREMENT,uId VARCHAR,date TEXT,type VARCHAR,path TEXT);";
    //QString select_sql = "select *from source;";

    pSqlQuery.prepare(create_sql);
    if(!pSqlQuery.exec()){
        qDebug() << pSqlQuery.lastError();
    }
    else{
        qDebug() << "source table create success!";
    }
}

void SqlData::initSettingTable()
{
    QSqlQuery pSqlQuery;
    QString create_sql = "create table setting(uId VARCHAR,imgpath TEXT,videopath TEXT,time TEXT);";

    pSqlQuery.prepare(create_sql);
    if(!pSqlQuery.exec()){
        qDebug() << pSqlQuery.lastError();
    }
    else{
        qDebug() << "setting table create success!";
    }
}

bool SqlData::creatPath(const QString filePath)
{
    QDir dir(filePath);
    if(dir.exists()) {
        return true;
    }
    else {
        bool ok = dir.mkpath(filePath);  //创建多级目录
        return ok;
    }
}

bool SqlData::loginCheck(QString ID, QString Pwd)
{
    bool ret = searchUser(ID);
    if(ret != true)
    {
        QMessageBox::information(NULL,"提示","账号不存在");
        return false;
    }
    else
    {
        QSqlQuery pSqlQuery;
        QString select_sql = QString("select * from usr where uId = '%1' and pwd = '%2';").arg(ID).arg(Pwd);
        qDebug()<<select_sql;
        pSqlQuery.prepare(select_sql);
        if(!pSqlQuery.exec())
        {
            qDebug()<<"登录失败"<<pSqlQuery.lastError();
            return false;
        }
        else
        {
            QString id;
            QString pwd;
            while(pSqlQuery.next())
            {
                id = pSqlQuery.value(0).toString();
                pwd = pSqlQuery.value(2).toString();
                qDebug()<<QString("id:%1 pwd:%2").arg(id).arg(pwd);//  sprintf("")
            }
            if(id == 0)
            {
                qDebug()<<"登录失败 密码错误";
                QMessageBox::information(NULL,"提示","登录失败 密码错误");
                return false;
            }
            else
            {
                qDebug()<<"登录成功";
                return true;
            }
        }
    }
}

bool SqlData::registCheck(QString ID, QString Name, QString Pwd)
{
    bool ret = searchUser(ID);
    if(ret == false)
    {
        QSqlQuery mySqlQuery;
        QString insert_sql = QString("insert into usr values('%1','%2','%3',1);").arg(ID).arg(Name).arg(Pwd);
        mySqlQuery.prepare(insert_sql);
        if(!mySqlQuery.exec())
        {
            qDebug()<<"注册失败"<<mySqlQuery.lastError();
            QMessageBox::information(NULL,"提示","注册失败");
            return false;
        }
        else
        {
            qDebug()<<"注册成功";
            QMessageBox::information(NULL,"提示","注册成功");
            return true;
        }
    }
    else
    {
        qDebug()<<"账号已存在";
        QMessageBox::information(NULL,"提示","账号已存在");
        return false;
    }
}

bool SqlData::searchUser(QString ID)
{
    QSqlQuery pSqlQuery;
    QString select_sql = QString("select * from usr where uId = '%1';").arg(ID);
    qDebug()<<select_sql;
    pSqlQuery.prepare(select_sql);
    if(!pSqlQuery.exec()) {
        qDebug()<<"查询失败"<<pSqlQuery.lastError();
        return false;
    }
    else {
        QString id;
        while(pSqlQuery.next())
        {
            id = pSqlQuery.value(0).toString();
        }
        if(id == NULL) {
            qDebug()<<"账号不存在";
            return false;
        }
        else {
            qDebug()<<"账号已注册";
            return true;
        }
    }
}

bool SqlData::insertSourcetable(QString uId, QString date, QString type, QString path)
{
    if(!uId.isEmpty()) {
        QSqlQuery pSqlQuery;
        QString insert_source = QString("insert into source values(NULL,'%1','%2','%3','%4');").arg(uId).arg(date).arg(type).arg(path);
        pSqlQuery.prepare(insert_source);
        if(!pSqlQuery.exec()){
            qDebug()<<"表格插入失败"<<pSqlQuery.lastError();
            return false;
        }
        else{
            qDebug()<<"表格插入成功";
            return true;
        }
    }
}

int SqlData::checkSettingTable(QString uId)
{
    QSqlQuery pSqlQuery;
    QString checkTable = QString("select * from setting where uId = %1;").arg(uId);
    pSqlQuery.prepare(checkTable);
    if(!pSqlQuery.exec()) {
        qDebug() << pSqlQuery.lastError();
        return 0;
    }
    else {
    	QString imgPath;
        QString videoPath;
        QString timeInterval;
        while(pSqlQuery.next())
        {
        	//将查询大的设置信息赋值给设置界面的结构体当中
            imgPath  = pSqlQuery.value(1).toString();
            videoPath = pSqlQuery.value(2).toString();
            timeInterval = pSqlQuery.value(3).toString();
        }
        qDebug() << imgPath << videoPath << timeInterval;
        if(imgPath.isEmpty()){
            qDebug() << "Never Setting Path";
            return 2;
        }
        else {
        	//检测路径是否存在 不存在 创建路径
            bool ret = creatPath(imgPath);
            bool ret2 = creatPath(videoPath);
            if(ret == true && ret2 == true) {
                qDebug() << "Allready setting";
                return 1;
            }
            else {
                qDebug() << "Never Setting Path";
                return 2;
            }
        }
    }
}

bool SqlData::insertSettingTable(QString uId, QString imgpath, QString videopath, QString time)
{
    QSqlQuery pSqlQuery;
    QString insert = QString("insert into setting values('%1','%2','%3','%4')").arg(uId).arg(imgpath).arg(videopath).arg(time);
    pSqlQuery.prepare(insert);
    if(!pSqlQuery.exec()) {
        qDebug() << "setting insert failed!";
        return false;
    }
    else {
        qDebug() << "setting insert success!";
        return true;
    }
}

bool SqlData::updateSettingTable(QString uId, QString imgpath, QString videopath, QString time)
{
    QSqlQuery pSqlQuery;
    QString update_table = QString("update setting set imgpath = '%1',videopath = '%2',time = '%3' where uId = '%4';").arg(imgpath).arg(videopath).arg(time).arg(uId);
    pSqlQuery.prepare(update_table);
    if(!pSqlQuery.exec()) {
        qDebug() << "update table failed!";
        return false;
    }
    else {
        qDebug() << "update table success!";
        return true;
    }
}


相关标签: mysql Qt5 类