一、效果图
二、代码
#ifndef DATABASEACCESS_H
#define DATABASEACCESS_H
#include <QObject>
#include <QMutex>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMap>
#include <QVector>
#include <QSqlDriver>
#include <QDebug>
#include <QSqlRecord>
#include <QSqlError>
#include <QSqlResult>
#include <QSqlQueryModel>
#include <QDateTime>
//提供数据库、表基本操作框架
class DataBaseAccess
{
public:
explicit DataBaseAccess();
~DataBaseAccess();
static DataBaseAccess* instance();
//指定数据库,指定表 插入数据
void insertData(const QString& db,const QString& table,const QVector<QStringList>& values);
//指定数据库,指定表,指定表字段,提取指定条件数据
void selectData(const QString& db,const QString& table,const QStringList& fields,const QString& filter);
//指定数据库,指定表,指定表字段,依据指定条件,修改数据
void updateData(const QString& db,const QString& table,const QStringList& fields,const QStringList& values, const QString& filter);
//指定数据库,指定表,依据指定条件,删除记录
void deleteData(const QString& db,const QString& table,const QString& filter);
public:
void test();
private:
void init();
//统一维护数据库 数据表的创建
void init_dbTableData();
void init_dbTable();
private:
static QMutex m_mutex;
static DataBaseAccess *m_pDBaccess;
QMap<QString,QStringList> m_dbTableMap;//映射数据库连接和对应的表
};
#endif // DATABASEACCESS_H
#include "databaseaccess.h"
QMutex DataBaseAccess::m_mutex;
DataBaseAccess *DataBaseAccess::m_pDBaccess;
DataBaseAccess::DataBaseAccess()
{
init();
test();
}
DataBaseAccess::~DataBaseAccess()
{
}
DataBaseAccess *DataBaseAccess::instance()
{
if(m_pDBaccess == nullptr){
m_mutex.lock();
if(m_pDBaccess == nullptr){
m_pDBaccess = new DataBaseAccess;
}
m_mutex.unlock();
}
return m_pDBaccess;
}
void DataBaseAccess::insertData(const QString &db, const QString &table, const QVector<QStringList> &values)
{
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",db);
database.setDatabaseName(db);
if (!database.open()){
qDebug() << "insertData" << database.lastError();
}
QSqlQuery query(database);
QString sql_all = QString("SELECT * FROM %1").arg(table);
query.exec(sql_all);
int primary_key = 0;
if(query.last())
primary_key = query.value("id").toInt();
qDebug() << "primary_key" << primary_key;
bool query_succ = true;
if(!database.transaction())
qDebug() << "insertData transaction fail";
foreach(auto var,values){
QStringList list = var;
QString sql;
sql = "INSERT INTO %1 VALUES (" + QString::number(primary_key) + ", ";
primary_key++;
for(int i=0;i<list.size();i++){
sql = sql + "\"" + list.value(i) + "\"";
if(i != (list.size() - 1))
sql = sql + ", ";
else
sql = sql + ")";
}
sql = sql.arg(table);
qDebug() << "insertData sql" <<sql;
if(!query.exec(sql)){
query_succ = false;
qDebug() << "insertData" << query.lastError();
}
}
if(query_succ)
database.commit();
else
database.rollback();
database.close();
}
void DataBaseAccess::selectData(const QString &db, const QString &table, const QStringList &fields, const QString &filter)
{
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",db);
database.setDatabaseName(db);
if (!database.open()){
qDebug() << "selectData" << database.lastError();
}
QString sql = "SELECT ";
for(int i=0;i<fields.size();i++){
sql = sql + fields.value(i);
if(i != (fields.size() - 1))
sql = sql + ", ";
else
sql = sql + " ";
}
sql = sql + "FROM " + table + " WHERE " + filter;
qDebug() << "selectData sql" << sql;
if(!database.transaction())
qDebug() << "selectData transaction fail";
QSqlQuery query(database);
bool query_succ = query.exec(sql);
while (query.next()) {
qDebug()<<query.value("account").toString()<<query.value("appID").toString()<<query.value("appName").toString();
}
if(query_succ)
database.commit();
else
database.rollback();
database.close();
}
void DataBaseAccess::updateData(const QString &db, const QString &table, const QStringList &fields, const QStringList &values, const QString &filter)
{
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",db);
database.setDatabaseName(db);
if (!database.open()){
qDebug() << "updateData" << database.lastError();
}
QString sql = "UPDATE " + table + " SET ";
for(int i=0;i<fields.size();i++){
sql = sql + fields.value(i) + "=" + values.value(i);
if(i != (fields.size() - 1))
sql = sql + ", ";
}
sql = sql + " WHERE " + filter;
qDebug() << "updateData sql" << sql;
if(!database.transaction())
qDebug() << "updateData transaction fail";
QSqlQuery query(database);
bool query_succ = query.exec(sql);
while (query.next()) {
qDebug()<<query.value("account").toString()<<query.value("appID").toString()<<query.value("appName").toString();
}
if(query_succ)
database.commit();
else
database.rollback();
database.close();
}
void DataBaseAccess::deleteData(const QString &db, const QString &table, const QString &filter)
{
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",db);
database.setDatabaseName(db);
if (!database.open()){
qDebug() << "deleteData" << database.lastError();
}
QString sql = "DELETE FROM " + table;
sql = sql + " WHERE " + filter;
qDebug() << "deleteData sql" << sql;
if(!database.transaction())
qDebug() << "deleteData transaction fail";
QSqlQuery query(database);
bool query_succ = query.exec(sql);
if(query_succ)
database.commit();
else
database.rollback();
database.close();
}
void DataBaseAccess::test()
{
QStringList list0;
list0<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
QStringList list1;
list1<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
QStringList list2;
list2<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
QStringList list3;
list3<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
QStringList list4;
list4<<"pre1"<<"20202020202020"<<"baidu"<<"starttime"<<"endtime"<<"1"<<"0"<<"百度"<<"baidu.png"<<"F/img/tx";
QVector<QStringList> vfields;
vfields.append(list0);
vfields.append(list1);
vfields.append(list2);
vfields.append(list3);
vfields.append(list4);
insertData("TaskMgr.db","TaskMgrList0",vfields);
selectData("TaskMgr.db","TaskMgrList0",QStringList()<<"account"<<"appID"<<"appName",QString("id=2"));
updateData("TaskMgr.db","TaskMgrList0",QStringList()<<"account"<<"appID"<<"appName",QStringList()<<"111"<<"111"<<"111",QString("id=2"));
deleteData("TaskMgr.db","TaskMgrList0",QString("id=2"));
}
void DataBaseAccess::init()
{
init_dbTableData();
init_dbTable();
}
void DataBaseAccess::init_dbTableData()
{
QString db0 = "TaskMgr.db";
QStringList db0_tables;
QString create_sql0 = "CREATE TABLE TaskMgrList0("
"id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
"account varchar(255) NOT NULL ,"
"appID varchar(255) NOT NULL ,"
"appName varchar(255) ,"
"startTime varchar(255) ,"
"endTime varchar(255) ,"
"bOrder varchar(255) ,"
"status INTEGER NOT NULL ,"
"desc TEXT ,"
"fileName varchar(255) ,"
"filePath varchar(255) "
");";
QString create_sql1 = "CREATE TABLE TaskMgrList1("
"id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
"account varchar(255) NOT NULL ,"
"appID varchar(255) NOT NULL ,"
"appName varchar(255) ,"
"startTime varchar(255) ,"
"endTime varchar(255) ,"
"bOrder varchar(255) ,"
"status INTEGER NOT NULL ,"
"desc TEXT ,"
"fileName varchar(255) ,"
"filePath varchar(255) "
");";
db0_tables.append(create_sql0);
db0_tables.append(create_sql1);
m_dbTableMap.insert(db0,db0_tables);
}
void DataBaseAccess::init_dbTable()
{
qDebug()<<"init_db:"<<QSqlDatabase::drivers();
QMap<QString,QStringList>::iterator iter;
for(iter = m_dbTableMap.begin();iter!=m_dbTableMap.end();iter++) {
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE",iter.key());
database.setDatabaseName(iter.key());
if (!database.open()){
qDebug() << "Error: Failed to connect database." << database.lastError();
}
database.transaction();
QSqlQuery query(database);
foreach(auto var,iter.value()){
if(!query.exec(var)){
qDebug() << "Error: Failed to create table." << query.lastError();
}
}
database.commit();
database.close();
}
}
三、总结
1.封装DataBaseAccess数据库操作类,对外屏蔽sql语句具体实现细节
2.注意数据库驱动QSQLITE的选择
3.注意sql语句的格式,否者产生的问题比较多。