封装sqlite工具类

思路解释

  • 关闭数据库的时候,需要用局部变量保存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;
}
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

caochuanlin0123

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值