加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx学习笔记:sqlite3封装的简单工具类

发布时间:2020-12-14 21:08:57 所属栏目:百科 来源:网络整理
导读:---使用说明 都是静态方法,直接用即可,如下: Sql::open("PopStar");Sql::setInt(101,lv);Sql::setString("starData",starData.c_str());Sql::createTable("User","createtableUser(idinteger,nametext)");Sql::exec("deletefromUserwhereid=1");//增、删

---使用说明

都是静态方法,直接用即可,如下:

Sql::open("PopStar");
Sql::setInt(101,lv);
Sql::setString("starData",starData.c_str());
Sql::createTable("User","createtableUser(idinteger,nametext)");
Sql::exec("deletefromUserwhereid=1");//增、删、改的语句可以直接使用这个方法
Sql::exec("select*fromUser",loadRecordForString,&get);//查找的语句需要加个回调来处理数据
Sql::close();


---Sql.h

#ifndef_SQL_H_
#define_SQL_H_
#include"cocos2d.h"
#pragmacomment(lib,"sqlite3")
usingnamespacestd;
classSql{
public:
	staticvoidopen(constchar*sqlName);//打开数据库,传入数据库名称
	staticvoidexec(stringsql);//执行sql语句
	staticvoidexec(stringsql,int(*callback)(void*,int,char**,char**),void*arg);//执行sql语句,有回调
	staticvoidclose();//关闭,最好在操作完数据库后及时关闭
	//---以下是一些简单常用的方法---
	staticboolisTableExist(stringtableName);//判断该表是否存在
	staticvoidcreateTable(stringtableName,stringsql);//在不存在该表的情况下创建该表,需要传入表名、创建表的sql语句
	staticbooldeleteTable(stringtableName);
	staticintgetDataCount(stringtableName);//获取该表的行数
	//---存一些简单的数据的时候,无需手动创建表,功能类似UserDefault---
	staticvoidsetInt(intkey,intvalue);
	staticintgetInt(intkey,intdefaultValue);
	staticvoidsetString(stringkey,stringvalue);
	staticstringgetString(stringkey,stringdefaultValue);
};
#endif//_SQL_H_

---Sql.cpp

#include"Sql.h"
#include"sqlite3includesqlite3.h"
#include<stdlib.h>
#pragmacomment(lib,"sqlite3")
USING_NS_CC;

sqlite3*pDB=NULL;//数据库指针
char*errMsg=NULL;//错误信息
std::stringsqlstr;//SQL指令
intresult;//返回值

constchar*simpleTableNameInt="SimpleTableInt";
constchar*simpleTableNameString="SimpleTableString";

//打开数据库
voidSql::open(constchar*sqlName){
	//打开一个数据库,如果该数据库不存在,会自动创建一个
	result=sqlite3_open(sqlName,&pDB);
	if(result!=SQLITE_OK){
		CCLOG("opensqlitefail,code:%d,cause:%sn",result,errMsg);
	}
	else{
		CCLOG("opensqlitesuccess:%s",sqlName);
	}
	//目前只有int,之后会陆续优化改进
	sqlstr=String::createWithFormat("createtable%s(keyinteger,valueinteger)",simpleTableNameInt)->_string;
	createTable(simpleTableNameInt,sqlstr);
	sqlstr=String::createWithFormat("createtable%s(keytext,valuetext)",simpleTableNameString)->_string;
	createTable(simpleTableNameString,sqlstr);
}

//执行sql语句,示例如下:
//插入:insertintoMyTable_1(name)values('擎天柱')
//删除:deletefromMyTable_1whereID=2
//修改:updateMyTable_1setname='威震天'whereID=3
voidSql::exec(std::stringsql){
	result=sqlite3_exec(pDB,sql.c_str(),NULL,&errMsg);
	if(result!=SQLITE_OK){
		CCLOG("runsqlitefail:%s,errMsg);
	}
	else{
		CCLOG("runsqlitesuccess:%s",sql.c_str());
	}
}

//执行sql语句,有回调,一般用于查询语句
voidSql::exec(stringsql,void*arg){
	result=sqlite3_exec(pDB,callback,arg,sql.c_str());
	}
}

//关闭数据库
voidSql::close(){
	sqlite3_close(pDB);
}

//isTableExist的回调函数
intisExisted(void*para,intn_column,char**column_value,char**column_name)
{
	bool*isExisted_=(bool*)para;
	*isExisted_=(**column_value)!='0';
	return0;
}
//该表是否存在
boolSql::isTableExist(std::stringtableName){
	if(pDB!=NULL){
		//判断表是否存在
		boolisTableExist;
		sqlstr="selectcount(type)fromsqlite_masterwheretype='table'andname='"+tableName+"'";
		result=sqlite3_exec(pDB,sqlstr.c_str(),isExisted,&isTableExist,&errMsg);
		returnisTableExist;
	}
	returnfalse;
}

//创建一张表,如果已存在则不创建
//示例:createtableuser(idinteger,usernametext,passwordtext)
voidSql::createTable(std::stringtableName,std::stringsql){
	if(!isTableExist(tableName)){
		result=sqlite3_exec(pDB,&errMsg);
		if(result!=SQLITE_OK){
			CCLOG("createsqlitetable%sfail,tableName,errMsg);
		}
		else{
			CCLOG("createsqlitetablesuccess:%s",tableName);
		}
	}
}

//删除一张表
boolSql::deleteTable(std::stringtableName){
	if(isTableExist(tableName)){//表存在的时候,执行删除语句
		sqlstr="droptable"+tableName;
		result=sqlite3_exec(pDB,&errMsg);
		if(result!=SQLITE_OK){
			CCLOG("deletesqlitetable%sfail,errMsg);
			returnfalse;
		}
	}
	returntrue;//能执行到最后,就说明删除成功了
}

intloadRecordCount(void*para,intn_col,char**col_value,char**col_name){
	int*count=(int*)para;
	*count=n_col;
	return0;
}
//获取该表的行数
intSql::getDataCount(std::stringtableName){
	if(isTableExist(tableName)){
		sqlstr="selectcount(*)from"+tableName;
		intcount=0;
		result=sqlite3_exec(pDB,loadRecordCount,&count,&errMsg);
		if(result!=SQLITE_OK){
			CCLOG("getsqlitetabledatacountfail,errMsg);
		}
		returncount;
	}
	return0;
}

//存int
voidSql::setInt(intkey,intvalue){
	//先删除原先的数据
	sqlstr=String::createWithFormat("deletefrom%swherekey=%d",simpleTableNameInt,key)->_string;
	exec(sqlstr);
	//再插入
	sqlstr=String::createWithFormat("insertinto%s(key,value)values(%d,%d)",key,value)->_string;
	exec(sqlstr);
}
intloadRecordForInt(void*para,char**column_name){
	int*value=(int*)para;
	*value=atoi(column_value[1]);
	return0;
}
//取int
intSql::getInt(intkey,intdefaultValue){
	intget=defaultValue;
	exec(String::createWithFormat("select*from%swherekey=%d",key)->_string,loadRecordForInt,&get);
	returnget;
}

//存string
voidSql::setString(std::stringkey,std::stringvalue){
	//先删除原先的数据
	sqlstr=String::createWithFormat("deletefrom%swherekey='%s'",simpleTableNameString,key.c_str())->_string;
	exec(sqlstr);
	//再插入
	sqlstr=String::createWithFormat("insertinto%s(key,value)values('%s','%s')",key.c_str(),value.c_str())->_string;
	exec(sqlstr);
}
intloadRecordForString(void*para,char**column_name){
	string*value=(string*)para;
	*value=column_value[1];
	return0;
}
//取string
stringSql::getString(stringkey,stringdefaultValue){
	stringget=defaultValue;
	exec(String::createWithFormat("select*from%swherekey='%s'",key.c_str())->_string,&get);
	returnget;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读