Cocos2d-X 学习笔记 18 Cocos2dx 下对sqlite3 的简单封装

DBUtil.h:

  1. classDBUtil{
  2. public:
  3. /************************************************************
  4. 封装<atarget="_blank"style="color:#0000F0;display:inline;position:static;background:none;"href="http://www.so.com/s?q=sqlite3&ie=utf-8&src=se_lighten_f">sqlite3</a>操作
  5. ************************************************************/
  6. //用来创建一个db数据库db为数据库的名字
  7. //打开数据库
  8. staticvoidinitDB(constchar*db);
  9. //用来判断表格是否存在
  10. //name:表示表名
  11. staticbooltableIsExist(stringname);
  12. //用来创建一个表名为name的表格,创建时会先匹配时否有该表的存在如果存在则不创建
  13. //创建表
  14. voidcreateTable(stringsql,stringname);
  15. //用来删除一张表名为name的表格,删除时会先匹配是否有该表的存在如果不存在则不执行删除操作
  16. //删除表名
  17. voiddeleteTable(stringsql,0); background-color:inherit">//用来向表中插入一条数据
  18. //插入一条数据
  19. voidinsertData(stringsql);
  20. //用来向表中删除一条数据
  21. //删除一条数据
  22. voiddeleteData(stringsql);
  23. //用来向表中修改一条数据
  24. //修改一条数据
  25. voidupdateData(stringsql);
  26. //获取一个记录的条数
  27. //获得记录的条数
  28. intgetDataCount(stringsql);
  29. //读取一条记录的信息
  30. /*
  31. *此方法是查询方法,相当之重要,pSender最好是个vector
  32. */
  33. voidgetDataInfo(stringsql,void*pSend);
  34. //关闭打开的数据库
  35. voidcloseDB();
  36. };

DBUtil.cpp:

copy
    sqlite3*pDB=NULL;//数据库指针
  1. char*errMsg=NULL;//错误信息
  2. std::stringsqlstr;//SQL指令
  3. intresult;//sqlite3_exec返回值
  4. //创建数据库
  5. voidDBUtil::initDB(char*db)
  6. {
  7. //打开一个数据库,如果该数据库不存在,则创建一个数据库文件
  8. result=sqlite3_open(db,&pDB);
  9. if(result!=SQLITE_OK)
  10. CCLog("打开数据库失败,错误码:%d,错误原因:%s\n",result,errMsg);
  11. }
  12. //tableIsExist的<atarget="_blank"style="color:#0000F0;display:inline;position:static;background:none;"href="http://www.so.com/s?q=%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0&ie=utf-8&src=se_lighten_f">回调函数</a>
  13. intisExisted(void*para,intn_column,87); background-color:inherit; font-weight:bold">char**column_value,87); background-color:inherit; font-weight:bold">char**column_name)
  14. bool*isExisted_=(bool*)para;
  15. *isExisted_=(**column_value)!='0';
  16. return0;
  17. }
  18. //判断表格是否存在
  19. boolDBUtil::tableIsExist(stringname)
  20. if(pDB!=NULL)
  21. //判断表是否存在
  22. booltableIsExisted;
  23. sqlstr="selectcount(type)fromsqlite_masterwheretype='table'andname='"+name+"'";
  24. result=sqlite3_exec(pDB,sqlstr.c_str(),isExisted,&tableIsExisted,&errMsg);
  25. returntableIsExisted;
  26. returnfalse;
  27. //在数据库中判断名为name的表示否存在,如果不存在则创建这张表
  28. //@示例语句stringsqls="createtableuser(idinteger,usernametext,passwordtext)";
  29. voidDBUtil::createTable(stringsql,stringname)
  30. {
  31. if(!tableIsExist(name))
  32. //创建表,设置ID为主键,且自动增加
  33. result=sqlite3_exec(pDB,sql.c_str(),NULL,&errMsg);
  34. if(result!=SQLITE_OK)
  35. CCLog("创建表失败,错误码:%d,错误原因:%s\n",errMsg);
  36. //删除表格
  37. //@示例语句sqlstr="droptablename";
  38. voidDBUtil::deleteTable(stringsql,stringname)
  39. if(tableIsExist(name))
  40. //插入数据
  41. //@示例语句sqlstr="insertintoMyTable_1(name)values('<atarget="_blank"style="color:#0000F0;display:inline;position:static;background:none;"href="http://www.so.com/s?q=%E6%93%8E%E5%A4%A9%E6%9F%B1&ie=utf-8&src=se_lighten_f">擎天柱</a>')";
  42. voidDBUtil::insertData(stringsql){
  43. CCLog("插入记录失败,错误码:%d,错误原因:%s\n",0); background-color:inherit">//删除数据
  44. //@示例语句sqlstr="deletefromMyTable_1whereID=2";
  45. voidDBUtil::deleteData(stringsql)
  46. //修改数据
  47. //@示例语句sqlstr="updateMyTable_1setname='威震天'whereID=3";
  48. voidDBUtil::updateData(stringsql)
  49. //getDataCount的回调函数
  50. intloadRecordCount(char**column_name)
  51. int*count=(int*)para;
  52. *count=n_column;
  53. return0;
  54. //获取记录的条数
  55. //@示例语句stringsqlsssss="selectcount(*)fromuser";
  56. //@示例语句取得表格字段的语句stringsqlsssss="select*fromuser";
  57. intDBUtil::getDataCount(stringsql)
  58. intcount=0;
  59. sqlite3_exec(pDB,loadRecordCount,&count,153); background-color:inherit; font-weight:bold">returncount;
  60. //getDataInfo的回调函数
  61. intloadRecord( CCLOG("n_column:%d",n_column);
  62. //TestVO*testVO=(TestVO*)para;
  63. //testVO->mId=atoi(column_value[0]);
  64. //testVO->level=atoi(column_value[1]);
  65. //testVO->lastscore=atoi(column_value[2]);
  66. //testVO->bestscore=atoi(column_value[3]);
  67. //testVO->star=atoi(column_value[4]);
  68. /*可能有5个字段*/
  69. //idlevellastscorebestscorestar
  70. //CCLOG("c[0]:%s,c[1]:%s,c[2]:%s,c[3]:%s,c[4]:%s",column_name[0],column_name[1],column_name[2],column_name[3],column_name[4]);
  71. //
  72. CCLog("id=%s,level=%s,lastscore=%s,bestscore=%s,star=%s",column_value[0],column_value[1],column_value[2],column_value[3],column_value[4]);
  73. //获取一条记录的信息其中的pSend是一个<atarget="_blank"style="color:#0000F0;display:inline;position:static;background:none;"href="http://www.so.com/s?q=%E5%AE%9E%E4%BD%93%E7%B1%BB&ie=utf-8&src=se_lighten_f">实体类</a>我们以后可以自定义一个继承了CCObject的类来代替他保存数据库中取出来的数据
  74. /*
  75. *这里最好扩展下,让pSend是一个vector
  76. */
  77. voidDBUtil::getDataInfo(stringsql,153); background-color:inherit; font-weight:bold">void*pSend)
  78. //关闭数据库
  79. voidDBUtil::closeDB()
  80. sqlite3_close(pDB);
  81. }


测试:

copy
    //TestDatabase
  1. stringfullDBPath=CCFileUtils::sharedFileUtils()->getWriteablePath()+"save.db";
  2. CCLOG("fullPath:%s",fullDBPath.c_str());
  3. DBUtil::initDB(fullDBPath.c_str());
  4. stringcreateTableSql="createtablezuma(idintegerprimarykeyautoincrement,levelinteger,lastscoreinteger,bestscoreinteger,starinteger);";
  5. DBUtil::createTable(createTableSql.c_str(),"zuma");
  6. //向表格中插入数据
  7. stringsqlss="insertintozuma(level,lastscore,bestscore,star)values(100,100,500,1)";
  8. /*插入一条数据*/
  9. DBUtil::insertData(sqlss);
  10. //更新
  11. stringupdateString="updatezumasetstar=5;";
  12. DBUtil::updateData(updateString);
  13. /*查询数据*/
  14. stringselectStr="select*fromzuma";
  15. //CCObject*pp=newCCObject();
  16. //DBUtil::getDataInfo(selectStr,pp);
  17. TestVO*testVO=newTestVO();
  18. testVO->mId=1111;
  19. DBUtil::getDataInfo(selectStr,testVO);
  20. /*显示结果*/
  21. CCLOG("id:%d",testVO->mId);
  22. CCLOG("level:%d",testVO->level);
  23. CCLOG("lastscore:%d",testVO->lastscore);
  24. CCLOG("bestscore:%d",testVO->bestscore);
  25. CCLOG("star:%d",testVO->star);
  26. deletetestVO;
  27. /*不能忘记关闭数据库*/
  28. DBUtil::closeDB();

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...