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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |