Cocos2d-x笔记(三)Sqlite数据库封装

上一篇已经介绍了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进行管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值