思路解释
- 关闭数据库的时候,需要用局部变量保存QSqlDatabase对象,不然在移除数据库链接的时候会报内存泄漏警告
- 在进行增删改查之前,首先调用HasValidConnection判断是否有有效的数据库链接,然后GetConnectionName,利用返还的数据库链接名再获取数据库链接对象。注意,这里也需要使用局部变量来保存数据库链接,不然最后移除的时候可能会报内存泄漏
- 在进行增删改查之前,需要打开BeginTransaction。操作完成之后,需要CommitTransaction
- 程序运行结束,需要手动调用CloseDataBase来关闭数据库链接
接口定义
class CSqliteTool
{
private:
CSqliteTool();
~CSqliteTool();
public:
/// \brief 打开数据库
///
/// 若数据库不存在,则直接创建
static void OpenDataBase(const QString& strConnectionName);
/// \brief 关闭数据库
static void CloseDataBase();
/// \brief 提交事务
static void CommitTransaction();
/// \brief 创建表
static bool CreateTable( const QString& strTableName, const QString& strTableField );
/// \brief 创建索引
static bool CreateIndex( const QString& strIndexName, const QString& strTableName, const QString& strIndexField,bool bUnique = false );
/// \brief 删除表
static bool DeleteTable(const QString& strTableName);
/// \brief 开启事务
static void BeginTransaction();
/// \brief 是否开启事务
static bool IsBeginTransaction();
/// \brief 是否存在有效的数据库链接
static bool HasValidConnection();
/// \brief 获取数据库链接名称
static QString GetConnectionName();
private:
static QString m_strConnectionName; //< 数据库链接名称
static bool m_bIsBeginTransaction; //< 是否开启数据库事务
};
具体实现
QString CSqliteTool::m_strConnectionName;
bool CSqliteTool::m_bIsBeginTransaction = false;
CSqliteTool::CSqliteTool()
{
}
CSqliteTool::~CSqliteTool()
{
}
void CSqliteTool::OpenDataBase( const QString& strConnectionName )
{
m_strConnectionName = strConnectionName;
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", strConnectionName);
db.setDatabaseName(strConnectionName);
if (!db.open())
{
qDebug() << db.lastError().text();
}
}
void CSqliteTool::CloseDataBase()
{
if (QSqlDatabase::contains(m_strConnectionName))
{
{
QSqlDatabase db = QSqlDatabase::database(m_strConnectionName);
if (db.isValid())
{
if (db.isOpen())
{
db.close();
}
}
}
QSqlDatabase::removeDatabase(m_strConnectionName);
}
}
void CSqliteTool::BeginTransaction()
{
if (QSqlDatabase::contains(m_strConnectionName))
{
QSqlDatabase db = QSqlDatabase::database(m_strConnectionName);
if (db.isValid())
{
if (db.isOpen())
{
m_bIsBeginTransaction = db.transaction();
}
}
}
}
bool CSqliteTool::IsBeginTransaction()
{
return m_bIsBeginTransaction;
}
void CSqliteTool::CommitTransaction()
{
if (m_bIsBeginTransaction)
{
if (QSqlDatabase::contains(m_strConnectionName))
{
QSqlDatabase db = QSqlDatabase::database(m_strConnectionName);
if (db.isValid())
{
if (db.isOpen())
{
if (!db.commit())
{
qDebug() << db.lastError().text();
}
m_bIsBeginTransaction = false;
}
}
}
}
}
bool CSqliteTool::CreateTable( const QString& strTableName, const QString& strTableField )
{
if (QSqlDatabase::contains(m_strConnectionName))
{
QSqlDatabase db = QSqlDatabase::database(m_strConnectionName);
if (db.isValid())
{
if (db.isOpen())
{
QSqlQuery sql_query(db);
QString strIsTableExists = QString("select count(*) from sqlite_master where type='table' and name='%1'").arg(strTableName);
if (!sql_query.prepare(strIsTableExists))
{
qDebug()<<sql_query.lastError().text();
return false;
}
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError().text();
return false;
}
if (!sql_query.next())
{
qDebug()<<sql_query.lastError().text();
return false;
}
if(sql_query.value(0).toInt() == 0) //not exist
{
QString strCreateTable = QString("create table %1 (%2)").arg(strTableName).arg(strTableField);
if (!sql_query.prepare(strCreateTable))
{
qDebug()<<sql_query.lastError().text();
return false;
}
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError().text();
return false;
}
}
}
}
}
return true;
}
bool CSqliteTool::CreateIndex( const QString& strIndexName, const QString& strTableName, const QString& strIndexField,bool bUnique /*= false*/ )
{
if (QSqlDatabase::contains(m_strConnectionName))
{
QSqlDatabase db = QSqlDatabase::database(m_strConnectionName);
if (db.isValid())
{
if (db.isOpen())
{
QString strCreateIndex;
if (bUnique)
{
strCreateIndex = QString("create unique index %1 on %2 (%3)").arg(strIndexName).arg(strTableName).arg(strIndexField);
}
else
{
strCreateIndex = QString("create index %1 on %2 (%3)").arg(strIndexName).arg(strTableName).arg(strIndexField);
}
QSqlQuery sql_query(db);
if (!sql_query.prepare(strCreateIndex))
{
qDebug()<<sql_query.lastError().text();
return false;
}
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError().text();
return false;
}
}
}
}
return true;
}
bool CSqliteTool::DeleteTable(const QString& strTableName)
{
if (QSqlDatabase::contains(m_strConnectionName))
{
QSqlDatabase db = QSqlDatabase::database(m_strConnectionName);
if (db.isValid())
{
if (db.isOpen())
{
QString strDropStatement = QString("drop table %1").arg(strTableName);
QSqlQuery sql_query(db);
if (!sql_query.prepare(strDropStatement))
{
qDebug() << sql_query.lastError().text();
return false;
}
if (!sql_query.exec())
{
qDebug() << sql_query.lastError().text();
return false;
}
}
}
}
return true;
}
bool CSqliteTool::HasValidConnection()
{
if (m_strConnectionName.isEmpty())
{
return false;
}
return QSqlDatabase::contains(m_strConnectionName);
}
QString CSqliteTool::GetConnectionName()
{
return m_strConnectionName;
}