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

如何在你的cocos2dx中使用sqlite3

发布时间:2020-12-14 16:41:41 所属栏目:百科 来源:网络整理
导读:从性能上说,XML方式的存储基本可以满足1 MB以下的存储要求。但在更复杂的情景中,我们可能需要存储多种不同的类,每个类也需要存储不同的对象,此时XML存储的速度就将成为瓶颈。即便分文件存储,管理起来也很麻烦,这个时候可以引入数据库来提升存储效率。
从性能上说,XML方式的存储基本可以满足1 MB以下的存储要求。但在更复杂的情景中,我们可能需要存储多种不同的类,每个类也需要存储不同的对象,此时XML存储的速度就将成为瓶颈。即便分文件存储,管理起来也很麻烦,这个时候可以引入数据库来提升存储效率。
? 关系数据库是一种经典的数据库,其中的数据被组织成表的形式,具有相同形式的数据存放在同一张表中,表内每一行代表一个数据。在表的基础上,数据库为我们提供增、删、改、查等操作,这些操作通常采用SQL(结构化查询语言)表达。这种格式化、集中的存储再加上结构化的操作语言带来一个非常大的好处:可以进行深度的优化,大大提升存储和操作的效率。
? SQLite是移动设备上常用的一个嵌入式数据库,具有开源、轻量等特点,其源代码只有两个".c"文件和两个".h"文件,并且已经包括了充分的注释说明。相比MySQL或者SQL Server这样的专业级数据库,甚至是比起同样轻量级的Access,SQLite的部署都可谓非常简单,只要将这4个文件导入工程中即可,这使得编译之后的SQLite非常小。

? SQLite将数据库的数据存储在磁盘的单一文件中,并通过简单的外部接口提供SQL支持。由于其设计之初即是针对小规模数据的操作,在查询优化、高并发读写等方面做了极简化的处理,可以保证不占用系统额外的资源,因此,在大多数的嵌入式开发中,会比专业数据库有更快速、高效的执行效率。


好了,看看如何加入Sqlite3吧,先从官网http://www.sqlite.org/download.html,下载你所想要的版本的sqlite,我这下的是3.8.2的,在解压后,只有4个文件,没有.def或者是什么dll,lib,这个是要自己生成的。


解压后,将这四个文件添加到你的当前工程中,然后进行编译一下就可以了。


好了,先看个如何创建一个表:

[cpp] view plain copy
  1. 回调函数的格式如下:
  2. intsqlite_callback(
  3. void*pv,/*由sqlite3_exec()的第四个参数传递而来*/
  4. intargc,0); background-color:inherit">/*表的列数*/
  5. char**argv,0); background-color:inherit">/*指向查询结果的指针数组,可以由sqlite3_column_text()得到*/
  6. char**col/*指向表头名的指针数组,可以由sqlite3_column_name()得到*/
  7. );
  8. 参数格式:
  9. 传给sqlite3_exec的回调函数,用来显示查询结果
  10. 对每一条查询结果调用一次该回调函数
  11. 参数:
  12. pv:由sqlite3_exec传递的初始化参数
  13. argc:表头的列数
  14. col:表头的名字数组指针
  15. argv:表头的数据数组指针
  16. 返回值:
  17. 1:中断查找
  18. 0:继续列举查询到的数据
  19. 示例表:
  20. +-----------------------------------+
  21. |id|pic|data(16进制数据)|
  22. |-----------------------------------|
  23. |1|a.jpg|000000...|
  24. |2|b.jpg|XXXXXX|
  25. 对第一行数据:
  26. argc=3即[0]...[2]
  27. argv[0]="1",argv[1]="a.jpg",argv[2]="000000..."(实际16进制数据,非这里显示的字符串形式)
  28. col[0]="id",col[1]="pic",col[2]="data"
  29. 说明:
  30. sqlite3_exec()的回调函数必须按照此格式,当然形参的名字任意.
  31. 如果某列的数据类型不是char*,则可以对结果执行相关的转换,如:用atoi()把结果转换为整数(integer),如果是二进制数据,则可以直接强制类型转换,如:(void*)argv[i].
  32. 该回调函数有两种返回值类型.
  33. 1.返回零:sqlite3_exec()将继续执行查询.
  34. 2.返回非零:sqlite3_exec()将立即中断查询,且sqlite3_exec()将返回SQLITE_ABORT.
  35. 示例:
  36. inti;
  37. for(i=0;i<argc;i++)
  38. {
  39. printf("%st%snn",col[i],argv[i]);
  40. }
  41. 例子:
  42. m_pGameDataBase=prepareTableInDB("MyGame2","E:databaseMyGame");
  43. std::stringinsert_sql_("insertintoMyGame2values(123,"aaa",26,"man")");
  44. insertRecordIntoSqlite(insert_sql_);
  45. readRecord();//readtherecord
  46. //
  47. intreadFromSQLite(void*anyParam,intiColumn,87); background-color:inherit; font-weight:bold">char**pColumnValue,87); background-color:inherit; font-weight:bold">char**pColumnName){
  48. inticolumenCount=iColumn;
  49. for(inti=0;i<icolumenCount;++i){
  50. CCLOG("%s:%sn",pColumnName[i],pColumnValue[i]);
  51. return0;
  52. voidGameController::readRecord(){
  53. std::stringread_sql_("select*fromMyGame2");
  54. char*perrMsg=0;
  55. sqlite3_exec(m_pGameDataBase,
  56. read_sql_.c_str(),
  57. readFromSQLite,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> NULL,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> &perrMsg);
  58. sqlite3*GameController::prepareTableInDB(constchar*table,char*dbFilename){
  59. sqlite3*splite2Data=0;
  60. char*errMsg=0;
  61. if(SQLITE_OK!=sqlite3_open(dbFilename,&splite2Data)){
  62. CCLOG("OpentheGameDataTablefaliedn");
  63. return0;
  64. }
  65. std::stringstring_sql="createtableifnotexists"+std::string(table)+"(idintunsignedauto_incrementprimarykey,namevarchar(50),ageint,sexvarchar(10))";
  66. sqlite3_exec(splite2Data,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> string_sql.c_str(),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> NULL,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> &errMsg);//createatable;
  67. if(errMsg!=0){
  68. CCLOG("CreatetheDatatablefailedn");
  69. sqlite3_close(splite2Data);
  70. returnsplite2Data;
  71. voidGameController::insertRecordIntoSqlite(std::string&r_stringOrder){
  72. char*perrMsg=0;
  73. intinfo=sqlite3_exec(m_pGameDataBase,
  74. r_stringOrder.c_str(),248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> 0,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> 0,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> &perrMsg);
  75. do{
  76. if(perrMsg!=0){//executetheinstructfailed
  77. CCLOG("insertarecordintothetablefailedn");
  78. CCLOG("reason:%d,ErrorMessage:%sn",info,perrMsg);
  79. break;
  80. }while(0);
  81. sqlite3_close(m_pGameDataBase); }

(编辑:李大同)

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

    推荐文章
      热点阅读