SQLite在VC环境下的使用涉及到单例模式、SQLite的C++接口、编码转换等,这里提供一个自以为比较完善的解决方案以供参考,欢迎拍砖指导。
注:编程环境VS2012,以动态链接方式使用SQLite(参考20110512 SQLite下载与SQLite.lib生成),本文也没有考虑多线程的问题。
1、SQLite操作类
SQLiteHelper.h
/*
** FileName : SQLiteHelper.h
** Author : pigautumn
** Date : 2016/8/22
** Description : SQLite操作单例类
*/
#pragma once
#include "sqlite3.h"
#include <string>
#include <vector>
using std::string;
using std::vector;
class SQLiteHelper
{
public:
static SQLiteHelper& GetInstance();
~SQLiteHelper(void);
public:
bool IsTableExisted(const string& table_name); //表是否存在
bool CreateTable(const string& sql, const string& table_name); //创建表
bool DropTable(const string& table_name); //删除表
bool InsertData(const string& sql); //插入数据
bool UpdateData(const string& sql); //更新数据
bool DeleteData(const string& sql); //删除数据
bool GetDataCount(const string& sql, int& count); //获取记录个数
bool GetDataInfo(const string& sql, vector<vector<string>>& data); //获取记录
bool GetMaxId(const string& table_name, int& row_id); //获取最新插入数据的ID
const string& GetLastError() const { return m_ssErrMsg; } //获取错误信息
public:
void SetDBFileName(const string& file_name); //设置数据库文件名
void SetDBFileFolder(const string& file_path); //设置数据库路径
private:
SQLiteHelper(void);
SQLiteHelper(const SQLiteHelper&); //拷贝构造函数只声明不实现
SQLiteHelper& operator=(const SQLiteHelper&); //赋值函数只声明不实现
bool OpenDB(); //打开数据库
void CloseDB(); //关闭数据库
bool ExcuteSQL(const string& sql); //执行SQL语句
static int IsTableExisted(void* para, int n_column, char** column_value, char** column_name); //判断表是否存在
private:
static string m_ssErrMsg; //错误信息
static int m_snResult; //错误码
string m_sDBFileName; //数据库文件名
string m_sDBFilePath; //数据库文件路径
sqlite3* m_pDB; //数据库指针
string m_sDBFileNameUtf8; //UTF8编码数据库文件名
string m_sDBFilePathUtf8; //UTF8编码数据库文件路径
bool m_bConvertDBFile; //是否转换数据库名称编码
};
SQLiteHelper.cpp
#include "stdafx.h"
#include "SQLiteHelper.h"
#include "CodeConverter.h"
#include <windows.h>
#include <sstream>
using std::stringstream;
//Init static class member
string SQLiteHelper::m_ssErrMsg = "";
int SQLiteHelper::m_snResult = 0;
SQLiteHelper::SQLiteHelper(void)
: m_pDB(NULL)
, m_sDBFileName("data.db")
, m_sDBFilePath(".")
, m_bConvertDBFile(true)
{
m_sDBFilePath = string("./") + m_sDBFileName;
}
SQLiteHelper::~SQLiteHelper(void)
{
}
SQLiteHelper& SQLiteHelper::GetInstance()
{
static SQLiteHelper s_manager;
return s_manager;
}
//设置数据库文件名
void SQLiteHelper::SetDBFileName(const string& file_name)
{
m_sDBFileName = file_name;
m_sDBFilePath = string("./") + m_sDBFileName;
m_bConvertDBFile = true;
}
//设置数据库路径
void SQLiteHelper::SetDBFileFolder(const string& folder)
{
if (folder.length() <= 0)
{
return;
}
if ('\\' == folder[folder.length() - 1] || '/' == folder[folder.length() - 1])
{
m_sDBFilePath = folder + m_sDBFileName;
}
else
{
m_sDBFilePath = folder + string("/") + m_sDBFileName;
}
m_bConvertDBFile = true;
}
//打开数据库,如果该数据库不存在,就创建一个数据库
bool SQLiteHelper::OpenDB()
{
if (m_bConvertDBFile)
{
//将ASCII转换为UTF8(由于经常要打开数据库,因此将数据库文件名称转换为UTF8编码后保存)
m_sDBFilePathUtf8 = CodeConverter::AsciiToUtf8(m_sDBFilePath);
m_bConvertDBFile = false;
}
m_snResult = sqlite3_open(m_sDBFilePathUtf8.c_str(), &m_pDB);
if (m_snResult != SQLITE_OK)
{
stringstream ss;
ss << "Open database " << m_sDBFilePath << " failed.";
m_ssErrMsg = ss.str();
return false;
}
return true;
}
//关闭数据库
void SQLiteHelper::CloseDB()
{
sqlite3_close(m_pDB);
}
//判断表是否存在
//para:传进回调函数的参数,n_column:字段个数