Qt操作多个Sqlite数据库和文件读写

摘要

Qt自带sqlite的驱动,也有各种文件的读写操作,用起来很是方便,这里仅仅是做了一个简单的封装,方便多个数据库和多个文件的操作。
    用到这块的时候网上搜了很多参考资料,感谢大家的无私分享,这里把搜后整理的结果分享给大家,对无私分享的广大码农表示感谢!!!如有需要可随意转载与粘贴。
    在此封装了一个datacontrol类,来控制多个数据库文件的操作。
    需要加以说明的是:
    1)sqlite的事务机制,正常情况下执行sql语句,会出现频繁的数据库读写操作,启用事务机制后,会在一定状态下去执行数据库的读写,相当于内存里面有一个缓冲池,会提高n倍的数据库操作效率。
    2)如何以指针的形式保存QsqlDatabase
    3)对sqlite采用打开数据库采用不同的连接名称,为什么要采用不同的链接名称?这就是同时操作多个sqlite数据库的答案。
    4)文件的读写,这里做的比较简单,数据库的读写也很简单,没有对sql语句的执行进行封装,有兴趣的朋友可以继续完善。
    声明:此处没有任何创新,都来自于物联网   【码友】    的贡献。

代码

不多说废话了,粘贴代码
先是头文件

#ifndef _DATA_CONTROL_H_
#define _DATA_CONTROL_H_

#include <Qtsql/qsqldatabase.h>
#include <Qtsql/qsqlquery.h>
#include <Qtsql/qsqlerror>
#include <qstring>
#include <QtCore/qstringlist>
#include <QFile>
#include <QtCore/qmap.h>


//数据操作类
//使用QMap实现一个简单的锁

namespace QTOOL {
    class DataControl {
    public:
        DataControl();
        ~DataControl();

        //打开、关闭数据库
        QsqlDatabase* OpenDataBase(QString strDataBase);
        bool CloseDataBase(QString strDataBase);
        QsqlDatabase* FindDataBase(QString strDataBase);
        QsqlDatabase* FlushDataBase(QString strDataBase);

        //打开、关闭文件
        QFile* OpenFile(QString strFile,QFlags<qiodevice::OpenModeFlag> eOpenMode = qiodevice::Append);
        bool CloseFile(QString strFile);
        QFile* FindFile(QString strFile);

        //bool 


        public:
        QMap<QString,QsqlDatabase*> m_mapDataBase;
        QMap<QString,QFile*> m_mapFile;

    };
}
//////////////////////////////////////////////////////////////////////////
//================================写文件示例==============================
//QTOOL::DataControl dc;
//QFile* file = dc.OpenFile(QString::fromLocal8Bit("d:/test.ini"));
//if (file != NULL)
//{
// QTextStream ts(&*file);
// for (int i = 0; i < 10;i++)
// {
// ts<<"hello " << i << "\n";
// }
// file->flush();
// file->close();
//}

//////////////////////////////////////////////////////////////////////////
//============================读文件示例==================================
//QTOOL::DataControl dc;
//
//QString fileAddress = QString::fromLocal8Bit("d:/test.ini");
//QFile* file = dc.OpenFile(fileAddress,qiodevice::ReadOnly);
//QTextStream ts(file);
//
//QString fileDate = ts.readLine();
//QString dataBaseStruct = ts.readLine();
//while(!ts.atEnd())
//{
// a++;
// QString strCurrentLine = ts.readLine();
// QStringList strListCurrentLine = strCurrentLine.split(";");
//
//}
//dc.CloseFile(fileAddress);

//////////////////////////////////////////////////////////////////////////
//======================读数据库并写入文件示例============================
//QTOOL::DataControl dc;
//
//QString fileAddress = QString::fromLocal8Bit("d:/test2.ini");
//QFile* file = dc.OpenFile(fileAddress,qiodevice::ReadWrite|qiodevice::Truncate);
//QTextStream ts(file);
//
////ts<<"ID;BELONG;NAME;STATE;LON;LAT;PIC\n";
//
//QString fileDate = ts.readLine();
//QString dataBaseStruct = ts.readLine();
//
////打开数据库
//QString strDataBaseAddress = QString::fromLocal8Bit("d:/test.db");
//QsqlDatabase* database = dc.OpenDataBase(strDataBaseAddress);
//QString create_sql = "create table student (id int,belong varchar(100),name varchar(100),state int,lon float,lat float,pic varchar(200))";
//QString insert_sql = "insert into student values (?,?,?)";
//QString select_all_sql = "select * from student";
////QsqlQuery类提供执行和操作的sql语句的方法
////可以用来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE、DELETE, 
////以及DDL(数据定义语言)语句,例如CREATE TABLE。
////也可以用来执行那些不是标准的sql数据库特定的命令。
//QsqlQuery sql_query(*database);
//sql_query.prepare(select_all_sql);
//
//if (sql_query.exec())
//{
// while(sql_query.next())
// {
// ts<<sql_query.value(0).toString()<<";"<<sql_query.value(1).toString()<<";"
// <<sql_query.value(2).toString()<<";"<<sql_query.value(3).toString()<<";"
// <<sql_query.value(4).toString()<<";"<<sql_query.value(5).toString()<<";"
// <<sql_query.value(6).toString()<<"\n";
//
// }
//}
//
//dc.FlushDataBase(strDataBaseAddress);
//dc.CloseFile(fileAddress);
//dc.CloseDataBase(strDataBaseAddress);
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
//=======================读文件并写入数据库示例===========================
//QTOOL::DataControl dc;
//
//QString fileAddress = QString::fromLocal8Bit("d:/test.ini");
//QFile* file = dc.OpenFile(fileAddress,qiodevice::ReadOnly);
//QTextStream ts(file);
//
////ts<<"ID;BELONG;NAME;STATE;LON;LAT;PIC\n";
//
//QString fileDate = ts.readLine();
//QString dataBaseStruct = ts.readLine();
//
////打开数据库
//QString strDataBaseAddress = QString::fromLocal8Bit("d:/test.db");
//QsqlDatabase* database = dc.OpenDataBase(strDataBaseAddress);
//QString create_sql = "create table student (id int,?)";
//
////QsqlQuery类提供执行和操作的sql语句的方法
////可以用来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE、DELETE, 
////以及DDL(数据定义语言)语句,例如CREATE TABLE。
////也可以用来执行那些不是标准的sql数据库特定的命令。
//QsqlQuery sql_query(*database);
//sql_query.prepare(create_sql);
//if(!sql_query.exec())
//{
// qDebug()<<sql_query.lastError();
//}
//else
//{
// qDebug()<<"table created!";
//}
//
//int a = 0;
//
//while(!ts.atEnd())
//{
// a++;
// QString strCurrentLine = ts.readLine();
// QStringList strListCurrentLine = strCurrentLine.split(";");
//
//
// strListCurrentLine.at(0);
// sql_query.prepare(insert_sql);
// sql_query.addBindValue(strListCurrentLine.at(0).toInt());
// sql_query.addBindValue(strListCurrentLine.at(1));
// sql_query.addBindValue(strListCurrentLine.at(2));
// sql_query.addBindValue(strListCurrentLine.at(3).toInt());
// sql_query.addBindValue(strListCurrentLine.at(4).toFloat());
// sql_query.addBindValue(strListCurrentLine.at(5).toFloat());
// sql_query.addBindValue(strListCurrentLine.at(6));
//
// if(!sql_query.exec())
// {
// qDebug()<<sql_query.lastError();
// }
// else
// {
// qDebug()<<"inserted!";
// }
//}
//dc.FlushDataBase(strDataBaseAddress);
//
//dc.CloseFile(fileAddress);
//dc.CloseDataBase(strDataBaseAddress);

//////////////////////////////////////////////////////////////////////////
#endif

cpp文件

#include "DataControl.h"


QTOOL::DataControl::DataControl()
{

}

QTOOL::DataControl::~DataControl()
{
    //对没有关闭数据库进行关闭
    if (m_mapDataBase.count() > 0)
    {
        QMap<QString,QsqlDatabase*>::iterator it = m_mapDataBase.begin();
        if (it != m_mapDataBase.end())
        {
            if (it.value()->isopen()) { it.value()->close();
            }
        }
        m_mapDataBase.clear();
    }

    //对没有关闭文件进行关闭
    if (m_mapFile.count() > 0)
    {
        QMap<QString,QFile*>::iterator it2 = m_mapFile.begin();
        if (it2 != m_mapFile.end())
        {
            if (it2.value()->isopen()) { it2.value()->close();
            }
        }
        m_mapFile.clear();
    }
}

QsqlDatabase* QTOOL::DataControl::OpenDataBase( QString strDataBase )
{
    QMap<QString,QsqlDatabase*>::iterator it = m_mapDataBase.find(strDataBase);
    if (it != m_mapDataBase.end())
    {
        //判断数据库库是否已经被关闭
        if (!m_mapDataBase[strDataBase]->isopen())
        {
            m_mapDataBase[strDataBase]->open();
        }
        //开启一个事务,使用事务批量写入sqlite的速度会有很大的提高。
        m_mapDataBase[strDataBase]->transaction();
        return (m_mapDataBase[strDataBase]);
    }

    //注意:这里使用文件地址作为链接名称,否则打开多个数据库,先打开的会被后打开的覆盖。
    QsqlDatabase* database= new QsqlDatabase(QsqlDatabase::addDatabase("QsqlITE",strDataBase));

    database->setDatabaseName(strDataBase);
    database->setUserName("root123");  
    database->setPassword("123456");

    //打开数据库
    if(!database->open())
    {
        return NULL;
    }

    m_mapDataBase.insert(strDataBase,database);

    m_mapDataBase[strDataBase]->transaction();
    return m_mapDataBase[strDataBase];
}

bool QTOOL::DataControl::CloseDataBase( QString strDataBase )
{
    QMap<QString,QsqlDatabase*>::iterator it = m_mapDataBase.find(strDataBase);

    if (it != m_mapDataBase.end())
    {
        //关闭文件
        //先结束事务(不结束应该也没什么影响,关闭自动刷新的)
        it.value()->commit();
        it.value()->close();
        //从列表里面删除
        m_mapDataBase.erase(it);
        return true;
    }
    return false;
}

QsqlDatabase* QTOOL::DataControl::FindDataBase( QString strDataBase )
{
    QMap<QString,QsqlDatabase*>::iterator it = m_mapDataBase.find(strDataBase);
    if (it != m_mapDataBase.end())
    {
        return (it.value());
    }
    return NULL;
}

QsqlDatabase* QTOOL::DataControl::FlushDataBase( QString strDataBase )
{
    QMap<QString,QsqlDatabase*>::iterator it = m_mapDataBase.find(strDataBase);
    if (it != m_mapDataBase.end())
    {
        //提交上一个事务,并开始一个新的事务
        it.value()->commit();
        it.value()->transaction();
        return (it.value());
    }
    return NULL;
}


QFile* QTOOL::DataControl::OpenFile( QString strFile,QFlags<qiodevice::OpenModeFlag> eOpenMode)
{
    QMap<QString,QFile*>::iterator it = m_mapFile.find(strFile);
    if (it != m_mapFile.end())
    {
        //判断文件是否已经被关闭
        if (!m_mapFile[strFile]->isopen())
        {
            m_mapFile[strFile]->open(eOpenMode);
        }
        return (m_mapFile[strFile]);
    }
    QFile* file = new QFile(strFile);

    if (file->open(eOpenMode))
    {
        m_mapFile.insert(strFile,file);
        return (m_mapFile[strFile]);
    }
    return NULL;
}

bool QTOOL::DataControl::CloseFile( QString strFile )
{
    QMap<QString,QFile*>::iterator it = m_mapFile.find(strFile);
    if (it != m_mapFile.end())
    {
        //关闭文件
        it.value()->close();
        //从列表里面删除
        m_mapFile.erase(it);
        return true;
    }
    return false;
}

QFile* QTOOL::DataControl::FindFile( QString strFile )
{
    QMap<QString,QFile*>::iterator it = m_mapFile.find(strFile);
    if (it != m_mapFile.end())
    {
        return (it.value());
    }
    return NULL;
}

有任何疑问或错漏之处欢迎批评指正!

&&我是代码的搬运工&&

源码工程链接
http://download.csdn.net/detail/xiaopeixiaojun/9192219

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能