上一篇已经介绍了Sqlite数据库的简单操作。但在实际应用中太麻烦,为方便使用,简单的封装了一下Sqlite数据库的操作。
头文件如下:
class SqliteUtil
{
private:
sqlite3* pDB;
char* errMsg;
SqliteUtil* instance;
SqliteUtil(void);
~SqliteUtil(void);
public:
/**获取实例
*/
static SqliteUtil* getInstance();
/**释放*/
static void releaseInstance();
/**
* 开启数据库
* @param dbName 数据库名称
*/
bool openDB(std::string dbName);
/**
* 关闭数据库
*/
bool closeDB();
/**
* 创建数据表
* @param createSql 创建sql语句
*/
bool createTable(const char* createSql);
/**
插入数据
@param tableName 表名
@param content 插入的数据
*/
bool insert(std::string tableName,ContentValue* content);
/**
更新数据
@param tableName 表名
@param content 需要更新的数据
@param whereKey 列名
@param whereArg 值
*/
bool update(std::string tableName,ContentValue* content,std::string whereKey,std::string whereArg);
/**
删除数据
@param tableName 表名
@param whereKey 列名
@param whereArg 值
*/
bool remove(std::string tableName,std::string whereKey,std::string whereArg);
bool removeAll(std::string tableName);
/**
删除数据
@param tableName 表名
@param content 查询到的数据
@param whereKey 列名
@param whereArg 值
*/
bool select(std::string tableName,ContentValue* content,std::string whereKey,std::string whereArg);
/**
删除数据
@param tableName 表名
@param content 查询到的数据
*/
bool selectAll(std::string tableName,std::list<ContentValue*>* content);
/**
执行SQL语句
@param sql 需要执行的SQL语句
*/
bool execSQL(std::string sql);
/**
执行SQL语句
@param sql 需要执行的SQL语句
@param callback 回调函数
@param 回调函数的第一个参数
*/
bool execSQL(std::string sql,int (* callback)(void*,int,char**,char**), void *);
};
为了保证只有一个数据库操作实例,采用了单例模式。从头文件中可以看出这个类只是简单的封装了增、删、改、查的操作。还暴露了一个excel方法用于复杂的sql操作。下面看看具体的实现方法:
int selectCallBack(void * para, int n_column, char ** column_value, char ** column_name )
{
ContentValue* value = (ContentValue *)para;
for (int i = 0; i < n_column; i++)
{
value->setValue(column_name[i],column_value[i]);
}
return 0;
}
int selectAllCallBack(void * para, int n_column, char ** column_value, char ** column_name )
{
list<ContentValue*>* value = (list<ContentValue*>*)para;
ContentValue* raw = new ContentValue();
for (int i = 0; i < n_column; i++)
{
raw->setValue(column_name[i],column_value[i]);
}
value->push_back(raw);
return 0;
}
SqliteUtil::SqliteUtil(void)
{
}
SqliteUtil::~SqliteUtil(void)
{
}
SqliteUtil* SqliteUtil::getInstance()
{
if(instance == NULL)
{
instance = new SqliteUtil();
}
return instance;
}
void SqliteUtil::releaseInstance()
{
if(SqliteUtil::getInstance() != NULL)
{
delete SqliteUtil::getInstance();
}
}
bool SqliteUtil::openDB(std::string dbName)
{
std::string path ;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
path=CCFileUtils::sharedFileUtils()->getWritablePath()+dbName;
#else
path=dbName;
#endif
int result = sqlite3_open(path.c_str(),&(SqliteUtil::getInstance()->pDB));
if(result != SQLITE_OK)
{
CCLOG("create database failed,error code:%d,error reason:%s",result,errMsg);
return false;
}
return true;
}
bool SqliteUtil::closeDB()
{
int result = sqlite3_close(SqliteUtil::getInstance()->pDB);
if(result != SQLITE_OK)
{
CCLOG("close database failed,error code:%d,error reason:%s",result,errMsg);
return false;
}
return true;
}
bool SqliteUtil::createTable(const char* execSql)
{
return execSQL(execSql);
}
bool SqliteUtil::insert(const string tableName,ContentValue* content)
{
string sql;
sql = "insert into "+tableName +"("+content->getAllKey()+") values ("+content->getAllValue()+")";
return execSQL(sql);
}
bool SqliteUtil::update(std::string tableName,ContentValue* content,string whereKey,string whereArg)
{
string sql;
sql = "update "+tableName +" set "+content->getAll()+ "where "+whereKey +"=" +whereArg;
return execSQL(sql);
}
bool SqliteUtil::remove(std::string tableName,string whereKey,string whereArg)
{
string sql;
sql = "delete from "+tableName +" where "+whereKey +"=" +whereArg;
return execSQL(sql);
}
bool SqliteUtil::removeAll(std::string tableName)
{
string sql;
sql = "delete from "+tableName ;
return execSQL(sql);
}
bool SqliteUtil::select(std::string tableName,ContentValue* content,string whereKey,string whereArg)
{
string sql;
sql = "select * from "+tableName + "where "+whereKey +"=" +whereArg;
return execSQL(sql,selectCallBack,(void *)content);
}
bool SqliteUtil::selectAll(std::string tableName,list<ContentValue*>* content)
{
string sql;
sql = "select * from "+tableName;
return execSQL(sql,selectAllCallBack,(void *)content);
}
bool SqliteUtil::execSQL(string sql,int (*callback)(void*,int,char**,char**), void * param)
{
int result = sqlite3_exec(SqliteUtil::getInstance()->pDB,sql.c_str(),callback,param,&errMsg);
if(result != SQLITE_OK)
{
CCLOG("sqlite error,error code:%d,error reason:%s",result,errMsg);
return false;
}
return true;
}
bool SqliteUtil::execSQL(string sql)
{
int result = sqlite3_exec(SqliteUtil::getInstance()->pDB,sql.c_str(),NULL,NULL,&errMsg);
if(result != SQLITE_OK)
{
CCLOG("sqlite error,error code:%d,error reason:%s",result,errMsg);
return false;
}
return true;
}
实现方法都很简单,只是对一些Sql进行了拼接。
--------------------------------------------------------------------------------------
最好加一个引用计数器,对instance进行管理。