一.什么是sqlite?
SQLite是⼀个进程内的轻量级数据库, SQLite 引擎不是⼀个独立的进程,可以按应用程序需求进行静态或动态连接,SQLite 直接访问其存储文件
二.sqlite3接口介绍
1.创建数据库并返回操作句柄
int sqlite3_open(const char *filename, sqlite3 **ppDb)
返回值:成功返回SQLITE_OK
若在编译阶段启动了线程安全,则在程序运行阶段可以通过参数选择线程安全等级:
int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
flags常用的宏:
SQLITE_OPEN_READWRITE -- 以可读可写方式打开数据库文件
SQLITE_OPEN_CREATE -- 不存在数据库文件则创建
SQLITE_OPEN_NOMUTEX--多线程模式,只要不同的线程使⽤不同的连接即可保证线程 安全
说明:sqlite3是有三种安全等级的1. 非线程安全模式
2. 线程安全模式(不同的连接在不同的线程/进程间是安全的,但一个句柄不能用于多线程 间)
3. 串行化模式(可以在不同的线程/进程间使用同一个句柄)
2.执行语句
int sqlite3_exec(sqlite3*, char *sql, int (*callback) (void*,int,char**,char**), void* arg, char **err)
返回值:SQLITE_OK表示成功
callback参数说明:
void* : 是设置的在回调时传⼊的arg参数
int:一行中数据的列数
char**:存储一行数据的字符指针数组
char**:每一列的字段名称
callback返回值说明:
这个回调函数有个int返回值,成功处理的情况下必须返回0,返回非0会触发ABORT退出程序
3.销毁句柄
int sqlite3_close(sqlite3* db);
返回值:SQLITE_OK 表示成功
int sqlite3_close_v2(sqlite3*);
推荐使⽤——无论如何都会返回SQLITE_OK
获取错误信息:const char *sqlite3_errmsg(sqlite3* db);
三.sqlite3封装
#include <sqlite3.h>
#include <string>
#include <iostream>
using std::cout;
using std::endl;
class SqliteHelper
{
public:
typedef int(*SqliteCallback)(void*, int, char**, char**);
private:
std::string _dbfile;
sqlite3* _handler;
public:
SqliteHelper(const std::string& dbfile)
:_dbfile(dbfile)
,_handler(nullptr)
{}
bool open(int safeLevel = SQLITE_OPEN_FULLMUTEX)
{
//int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs)
int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safeLevel, nullptr);
if (ret != SQLITE_OK)
{
cout << "打开数据库失败:";
cout << sqlite3_errmsg(_handler) << endl;
return false;
}
return true;
}
bool execute(const std::string& sql, SqliteCallback cb, void* arg)
{
//int sqlite3_exec(sqlite3 *, const char *sql, int (*callback)(void *, int, char **, char **),
//void *, char **errmsg)
int ret = sqlite3_exec(_handler, sql.c_str(), cb, arg, nullptr);
if (ret != SQLITE_OK)
{
cout << "执行语句失败: " << endl;
cout << sqlite3_errmsg(_handler) << endl;
return false;
}
return true;
}
void close()
{
if (_handler)
{
sqlite3_close_v2(_handler);
}
}
};