sqlite封裝
為了提高開發效率和程式碼閱讀性基於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;
};
相關文章
- Android 封裝AsyncTask操作Sqlite資料庫Android封裝SQLite資料庫
- php封裝db 類連線sqlite3PHP封裝SQLite
- Android 原生 SQLite 資料庫的一次封裝實踐AndroidSQLite資料庫封裝
- 【封裝那些事】 缺失封裝封裝
- 七天.NET 8操作SQLite入門到實戰 - 第五天引入SQLite-net ORM並封裝常用方法(SQLiteHelper)SQLiteORM封裝
- windows安裝sqlite3WindowsSQLite
- 封裝封裝
- 【JavaScript框架封裝】公共框架的封裝JavaScript框架封裝
- 【封裝小技巧】is 系列方法的封裝封裝
- Dapper的封裝、二次封裝、官方擴充套件包封裝,以及ADO.NET原生封裝APP封裝套件
- ubuntu下安裝sqlite3UbuntuSQLite
- Flutter 封裝:富文字 RichText 極簡封裝Flutter封裝
- 封裝介面封裝
- ajax 封裝封裝
- axios封裝iOS封裝
- 封裝axios封裝iOS
- AVPlayer封裝封裝
- 09 #### 封裝封裝
- java 封裝Java封裝
- 封裝OCX封裝
- CentOS6.5安裝sqlite3CentOSSQLite
- 封裝、許可權修飾符、封裝的案例封裝
- 【封裝小技巧】列表處理函式的封裝封裝函式
- ToolBar封裝策略封裝
- axios封裝apiiOS封裝API
- jsonp promise 封裝JSONPromise封裝
- JS — websocket封裝JSWeb封裝
- TS MQTT封裝MQQT封裝
- JS功能封裝JS封裝
- Java(三)封裝Java封裝
- Flutter MVP 封裝FlutterMVP封裝
- request sdk 封裝封裝
- 09-封裝封裝
- svg sprite 封裝SVG封裝
- 何為封裝封裝
- weex 封裝actionSheetModule封裝
- 聊天chat封裝封裝
- 【NetCore】RabbitMQ 封裝NetCoreMQ封裝