sqlite封裝

wu110112發表於2020-12-04

為了提高開發效率和程式碼閱讀性基於sqlite3 api進行封裝

功能:

1、sqlite3增加資料(insert)

2、sqlite3修改資料(update)

3、sqlite3查詢資料(select)

4、sqlite3刪除資料(delete)

後續待補充功能:

1.事務提交功能

1.1 事務開啟

1.2 事務回滾

1.3 事務提交

demo下載地址https://download.csdn.net/download/wu110112/13451470

 

封裝類介紹:

SqliteConnect:sqlite連線類

SqliteQuery:sqlite查詢類

SqliteRecord:sqlite記錄集類

Value:對應的值轉換類

SqliteConnect介紹:

SqliteConnect.h

#pragma once
/**********************************************
* 作者:wujianhua
* 時間:2020/11/24
* 類介紹:sqlite連線類
*
***********************************************/
#include <string>
#include "../include/sqlite3.h"
#ifdef _M_IX86
#pragma comment(lib,"sqlite/x86/sqlite3.lib")
#else
#pragma comment(lib,"sqlite/x64/sqlite3.lib")
#endif // _M_IX86


class SqliteConnect
{
public:
	SqliteConnect();
	SqliteConnect(const char *database);
	~SqliteConnect();
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/11/24
	* 函式:開啟資料庫
	* 引數:
	*	 database:sqlite資料庫檔案路徑
	* 返回:
	*	 成功返回true,失敗返回false
	***********************************************/
	bool open(const char *database);
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/11/24
	* 函式:關閉資料庫連結
	* 引數:
	*	 無
	* 返回:
	*	 無
	***********************************************/
	void close();

	/**********************************************
	* 作者:wujianhua
	* 時間:2020/11/24
	* 函式:獲取資料庫物件
	* 引數:
	*	 無
	* 返回:
	*	 返回資料庫物件
	***********************************************/
	sqlite3 *getDatabase();
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/11/24
	* 函式:獲取最後的錯誤描述
	* 引數:
	*	 無
	* 返回:
	*	 返回錯誤描述資訊
	***********************************************/
	const char *getLastError();
private:
	sqlite3 *_db = nullptr;		//db物件
	std::string _database;		//資料庫路徑
	std::string _error;			//錯誤資訊
};

SqliteConnect.cpp

#include "stdafx.h"
#include "SqliteConnect.h"

SqliteConnect::SqliteConnect()
{

}

SqliteConnect::SqliteConnect(const char *database) :_database(database)
{
	open(database);
}


SqliteConnect::~SqliteConnect()
{
	close();
}

bool SqliteConnect::open(const char *database)
{
	_error.clear();
	_database = database;
	int code = sqlite3_open(_database.c_str(), &_db);
	if (code != SQLITE_OK)
	{
		_error = sqlite3_errmsg(_db);
		return false;
	}
	return true;
}

void SqliteConnect::close()
{
	if(_db)
		sqlite3_close(_db);
}

sqlite3 * SqliteConnect::getDatabase()
{
	return _db;
}

const char * SqliteConnect::getLastError()
{
	return _error.c_str();
}

SqliteQuery.h

#pragma once
/**********************************************
* 作者:wujianhua
* 時間:2020/11/24
* 類介紹:sqlite查詢類
*
***********************************************/
#include "SqliteConnect.h"
#include "SqliteRecord.h"
class SqliteQuery
{
public:
	SqliteQuery();
	SqliteQuery(SqliteConnect *connect);
	~SqliteQuery();
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/11/24
	* 函式:設定連線物件
	* 引數:
	*	 connect:連結物件
	* 返回:
	*	 無
	***********************************************/
	void setConnect(SqliteConnect *connect);
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/11/24
	* 函式:執行sql
	* 引數:
	*	 sql:sql語句
	* 返回:
	*	 執行成功返回true,失敗返回false
	***********************************************/
	bool exec(const char *sql);

	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:獲取記錄集指標
	* 引數:
	*	 無
	* 返回:
	*	 返回當前的記錄集指標
	***********************************************/
	SqliteRecord *getRecord();

	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:釋放記錄集指標
	* 引數:
	*	 無
	* 返回:
	*	 無
	***********************************************/
	void  releaseRecord();

	/**********************************************
	* 作者:wujianhua
	* 時間:2020/11/24
	* 函式:獲取查詢結果對應的錯誤描述
	* 引數:
	*	 無
	* 返回:
	*	 返回最後的錯誤描述資訊
	***********************************************/
	const char *getLastError();

private:
	SqliteConnect *_connect = nullptr;	//連線物件
	SqliteRecord *_record = nullptr;	//記錄集物件
	std::string _error;
	
};

SqliteQuery.cpp

#include "stdafx.h"
#include "SqliteQuery.h"

/**********************************************
* 作者:wujianhua
* 時間:2020/12/01
* 函式:sql執行回撥【每條記錄都會被回撥進來】
* 引數:
*	userData:自定義物件
*	argc:表列數
*	argv: 指向查詢結果的指標陣列, 可以由 sqlite3_column_text() 得到
*	col:指向表頭名的指標陣列, 可以由 sqlite3_column_name() 得到
* 返回:
*
***********************************************/
int sqlite3callback(void*userData, int argc, char** argv, char** col) 
{
	SqliteRecord *record = (SqliteRecord *)userData;
	if (record)
	{
		if (!record->empty())
		{
			record = record->addRecord();
		}
		for (int i=0; i<argc; i++)
		{
			record->addField(col[i], argv[i]);
			int id = record->getValue("ID")->toInt();
		}
	}
	return 0;
}

SqliteQuery::SqliteQuery(SqliteConnect *connect):_connect(connect)
{
}

SqliteQuery::SqliteQuery()
{
}

SqliteQuery::~SqliteQuery()
{
	releaseRecord();
}



void SqliteQuery::setConnect(SqliteConnect *connect)
{
	_connect = connect;
}

bool SqliteQuery::exec(const char *sql)
{
	_error.clear();
	char *err;
	releaseRecord();
	if (_record == nullptr)
	{
		_record = new SqliteRecord;
	}
	int code = sqlite3_exec(_connect->getDatabase(), sql, sqlite3callback, (void*)_record, &err);
	if (code != SQLITE_OK)
	{
		_error = err;
		return false;
	}
	//如果沒有記錄直接清理掉基路集指標
	if (_record && _record->empty())
	{
		releaseRecord();
	}
	return true;
}


SqliteRecord * SqliteQuery::getRecord()
{
	return _record;
}

void SqliteQuery::releaseRecord()
{
	if (_record)
	{
		delete _record;
		_record = nullptr;
	}
}

const char * SqliteQuery::getLastError()
{
	return _error.c_str();
}

SqliteRecord.h

#pragma once
/**********************************************
* 作者:wujianhua
* 時間:2020/12/01
* 類介紹:sqlite 記錄集
*
***********************************************/
#include "Value.h"
#include <string>
#include <map>
#include <vector>

typedef struct tag_field_info
{
	std::string name = "";
	Value *value = nullptr;
}FIELD_INFO, *LPFIELD_INFO;

class SqliteRecord
{
public:
	SqliteRecord();
	~SqliteRecord();
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:新增欄位資料
	* 引數:
	*	name:欄位名稱
	*	val:欄位值
	* 返回:
	*	無 
	***********************************************/
	void addField(std::string name, std::string val);

	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:清理記錄
	* 引數:
	*	 無
	* 返回:
	*	 無
	***********************************************/
	void clear();

	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:獲取值
	* 引數:
	*	 name:欄位名稱
	* 返回:
	*	 返回欄位對應的值物件,如果沒有返回nullptr
	***********************************************/
	Value* getValue(std::string name);
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:
	* 引數:
	*	下一條記錄 
	* 返回:
	*	 有記錄返回記錄物件,沒有記錄就返回nullptr
	***********************************************/
	SqliteRecord *next();

	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:
	* 引數:
	*	 
	* 返回:
	*	 
	***********************************************/
	SqliteRecord *addRecord();

	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:釋放下一個節點資料
	* 引數:
	*	 無
	* 返回:
	*	 無
	***********************************************/
	void releaseNext();
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:是否為空
	* 引數:
	*	 無
	* 返回:
	*	 返回true為空 返回false非空
	***********************************************/
	bool empty();
private:
	std::map<std::string, FIELD_INFO> _mapField;
	SqliteRecord *_next = nullptr;
	bool _empty = true;
};

SqliteRecord.cpp

#include "stdafx.h"
#include "SqliteRecord.h"

SqliteRecord::SqliteRecord()
{
}

SqliteRecord::~SqliteRecord()
{
	clear();
	releaseNext();
}

void SqliteRecord::addField(std::string name, std::string val)
{
	if(_mapField.find(name) == _mapField.end())
	{
		FIELD_INFO info;
		info.name = name;
		info.value = new Value(val);
		_mapField.insert(std::pair<std::string, FIELD_INFO>(name, info));
	}
	_empty = false;
}

void SqliteRecord::clear()
{
	//清空資料
	for (auto &it:_mapField)
	{
		if (it.second.value)
		{
			delete it.second.value;
			it.second.value = nullptr;
		}
	}
	_mapField.clear();
}

Value* SqliteRecord::getValue(std::string name)
{
	std::map<std::string, FIELD_INFO>::iterator it = _mapField.find(name);
	if (it != _mapField.end())
	{
		return it->second.value;
	}
	return nullptr;
}

SqliteRecord * SqliteRecord::addRecord()
{
	SqliteRecord *pNext = this->next();
	SqliteRecord *pNode = this;
	while (pNext)
	{
		pNode = pNext;
		pNext = pNext->next();
	}
	pNext = new SqliteRecord;
	pNode->_next = pNext;
	return pNext;
}

void SqliteRecord::releaseNext()
{
	if (_next)
	{
		delete _next;
		_next = nullptr;
	}
}

bool SqliteRecord::empty()
{
	return _empty;
}

SqliteRecord* SqliteRecord::SqliteRecord::next()
{
	return _next;
}

Value.h

#pragma once
/**********************************************
* 作者:wujianhua
* 時間:2020/12/01
* 類介紹:值轉換
*
***********************************************/
#include <string>
#include<stdlib.h>
class Value
{
public:
	Value() {};
	~Value() {};
	Value(std::string val) {
		_value = val;
	};
	
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:整形值
	* 引數:
	*	 無
	* 返回:
	*	 返回整形值
	***********************************************/
	int toInt() {
		return atoi(_value.c_str());
	}
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:雙精度值
	* 引數:
	*	 無
	* 返回:
	*	 返回雙精度值
	***********************************************/
	double toDoubel() {
		return atof(_value.c_str());
	}
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:單精度
	* 引數:
	*	 無
	* 返回:
	*	 返回單精度值
	***********************************************/
	float toFloat() {
		return atof(_value.c_str());
	}
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:布林值
	* 引數:
	*	 無
	* 返回:
	*	 返回true或false
	***********************************************/
	bool toBool() {
		return (bool)atoi(_value.c_str());
	}
	
	/**********************************************
	* 作者:wujianhua
	* 時間:2020/12/04
	* 函式:字串
	* 引數:
	*	 無
	* 返回:
	*	 返回字串
	***********************************************/
	const char * c_str() {
		return _value.c_str();
	}
private:
	std::string _value;
};

 

 

 

相關文章