头文件MySql.h
#ifndef MYSQL_H
#define MYSQL_H
#include <QWidget>
#include <QSqlDatabase>
#include <QtCore/QMutex>
struct ImageInfo //待存放的数据结构//
{
//每帧不一样,每帧都要记录//
int id;
double flightLongitude; //飞机经度//
int col; //列位置,定义靠近飞机的一侧为第0列//
ImageInfo(int a = 0, double b = 0, int c = 0)
{
id = a;
flightLongitude = b;
col = c;
}
};
class MySql
{
public:
MySql(QString& Dir);
~MySql();
private:
bool CreateConnection(); //创建数据库连接//
bool isDirExist(); //路径是否存在//
QString connectionName; //连接名称//
QString dbDir; //.db文件路径//
QSqlDatabase db;
QMutex mutex; //多线程资源访问控制//
public:
void closeDb(); //关闭数据库//
bool MyInsert(ImageInfo& InputImgInfo); //插入//
bool MySelect(int InputId,ImageInfo& OutputImgInfo); //查找//
bool MyDelete(int InputId); //删除//
bool MyUpdate(ImageInfo& InputImgInfo); //更新//
private:
void requestAccessToken(void); //加锁//
void releaseAccessToken(void); //解锁//
};
#endif // MYSQL_H
源文件MySql.cpp
#include "MySql.h"
#include <QDir>
#include<QDebug>
#include <QSqlQuery>
#include <QSqlError>
MySql::MySql(QString& Dir)
: dbDir(Dir)
{
connectionName = "sqlslite";
if (!isDirExist()) //若路径不存在则创建该路径//
{
QDir backup;
backup.mkdir(dbDir);
}
if (!CreateConnection())
{
qDebug() << "can open db!";
return;
}
}
MySql::~MySql()
{
closeDb();
}
bool MySql::CreateConnection()
{
db = QSqlDatabase::addDatabase("QSQLITE",connectionName); //创建一个SQLite数据库连接//
QString dbName = dbDir + "sql.db"; //本地数据库文件名//
db.setDatabaseName(dbName); //数据库连接命名//
if (!db.open()) //如果.db文件不存在,自动新建.db文件并打开//
{
return false;
}
QSqlQuery query(QSqlDatabase::database(connectionName));
query.exec("create table student(id int primary key,flightLongitude double,col int)"); //新建一张表,访问已有.bd时,执行该语句也不受影响//
return true;
}
bool MySql::isDirExist()
{
QDir temp_dir(dbDir);
if (temp_dir.exists())
{
return true;
}
else
{
return false;
}
}
void MySql::closeDb()
{
if (db.isOpen())
{
db.close();
}
}
bool MySql::MyInsert(ImageInfo& InputImgInfo)
{
requestAccessToken();
QSqlQuery query(QSqlDatabase::database(connectionName));
query.prepare("insert into student(id,flightLongitude,col)"
"values(:id,:flightLongitude,:col)");
query.bindValue(":id",InputImgInfo.id);
query.bindValue(":flightLongitude",InputImgInfo.flightLongitude);
query.bindValue(":col",InputImgInfo.col);
if (!query.exec())
{
return false;
}
releaseAccessToken();
return true;
//qDebug() << "/*************/" << Ok << query.lastError();
}
bool MySql::MySelect(int InputId,ImageInfo& OutputImgInfo)
{
requestAccessToken();
QSqlQuery query(QSqlDatabase::database(connectionName));
query.prepare("select * from student where id = :id");
query.bindValue(":id",InputId);
if (!query.exec())
{
return false;
}
query.next();
OutputImgInfo.id = query.value(0).toInt();
OutputImgInfo.flightLongitude = query.value(1).toDouble();
OutputImgInfo.col = query.value(2).toInt();
releaseAccessToken();
return true;
}
bool MySql::MyDelete(int InputId)
{
requestAccessToken();
QSqlQuery query(QSqlDatabase::database(connectionName));
query.prepare("delete from student where id = :id");
query.bindValue(":id",InputId);
if (!query.exec())
{
return false;
}
releaseAccessToken();
return true;
}
bool MySql::MyUpdate(ImageInfo& InputImgInfo)
{
requestAccessToken();
if (!MyDelete(InputImgInfo.id))
{
return false;
}
if (!MyInsert(InputImgInfo))
{
return false;
}
releaseAccessToken();
return true;
}
void MySql::requestAccessToken(void)
{
mutex.lock(); //如果已经lock且还未unlock,一直等待,直到unlock,然后lock//
}
void MySql::releaseAccessToken(void)
{
mutex.unlock();
}