sqlite3相关经验记录
记录工作中使用sqlite3
基本使用类封装
头文件
using SQL_RES = std::vector<std::map<std::string, std::string>>;
class CSqliteDb
{
public:
CSqliteDb();
~CSqliteDb();
void InitDb();
bool execSql(const char* sqlStr);
/*
** 查询语句
** result 结果集
*/
bool execSelect(const char* sqlStr , SQL_RES& result);
private:
sqlite3 *m_db;
};
源文件
CSqliteDb::CSqliteDb() {
m_db = NULL;
InitDb();
}
CSqliteDb::~CSqliteDb() {
if(m_db) {
sqlite3_close(m_db);
}
}
bool CSqliteDb::execSql(const char* sqlStr) {
spdlog::info("exec sql: {}",sqlStr);
char *errMsg;
int ret = sqlite3_exec(m_db ,sqlStr , 0 , 0 , &errMsg);
if(ret != SQLITE_OK) {
SPDLOG_LOGGER_ERROR(spdlog::get("skyense"),"[SQL] error: {} , sql: {}" , errMsg , sqlStr);
sqlite3_free(errMsg);
return false;
}
return true;
}
bool CSqliteDb::execSelect(const char* sqlStr , std::vector<std::map<std::string, std::string>> &result) {
bool retflg = false;
char *errMsg;
char **dbResult;
int nRow = 0, nColumn = 0;
int ret;
spdlog::info("sql: {}" , sqlStr);
ret = sqlite3_get_table(m_db , sqlStr , &dbResult , &nRow , &nColumn , &errMsg);
spdlog::info("row : {} , column : {}" , nRow , nColumn);
if(ret == SQLITE_OK) {
for(int i = 1 ; i < nRow + 1 ; ++i) {
std::map<std::string,std::string> valueMap;
for(int j = 0 ; j < nColumn ; ++j) {
if(dbResult[(i * nColumn) + j] != NULL) {
valueMap[dbResult[j]] = dbResult[(i * nColumn) + j];
} else {
valueMap[dbResult[j]] = "";
}
}
result.emplace_back(valueMap);
}
sqlite3_free_table(dbResult);
retflg = true;
} else {
SPDLOG_LOGGER_ERROR(spdlog::get("skyense") , "select error : {} , sql: {}" , errMsg , sqlStr);
}
sqlite3_free(errMsg);
return retflg;
}
触发器的使用
触发器就理解为数据库的回调函数,哪个表发生了哪个事件触发回调,可以让数据库自己处理对应关联的信息同步问题,不需要在代码里去实现,个人觉得相当方便。
查询创建的触发器
SELECT name FROM sqlite_master WHERE type = 'trigger';
创建触发器
CREATE TRIGGER task_del AFTER DELETE ON media begin delete from algoTask where devSerial=old.devSerial; end;