开发者社区> 技术小胖子> 正文

cocos2d-x学习笔记17:记录存储2:SQLite基本使用

简介:
+关注继续查看

 cocos2d-x学习笔记17:记录存储2:SQLite基本使用


一、安装与配置
SQLite是使用非常广泛的嵌入式数据库,它有着0配置,占用资源少等特点。从大型游戏《魔兽世界》到android上的很多游戏和软件(google提供了一个java语言的绑定。)

在cocos2d-x中,我们使用它的C语言绑定。
为了方便和简化篇幅,我们直接使用它的源代码。下载地址:
 
将其解压到cocos2d-x引擎目录下,得到一个“sqlite-amalgamation-3071000”文件夹,里面有四个源文件。

在VC中新建一个项目,起名叫Save。

然后,右键点项目-》属性-》配置属性-》C++-》常规-》附加包含目录
添加刚才的解压的源代码路径。
 
下一步,右键点项目-》添加-》现有项,选择那四个源代码文件。然后SQLite就配置好了。

二、初步使用

在HelloworldScene中,添加


  1. #include "sqlite3.h" 
然后在init函数中编写代码


  1. sqlite3 *pDB = NULL;//数据库指针 
  2. char * errMsg = NULL;//错误信息 
  3. std::string sqlstr;//SQL指令 
  4. int result;//sqlite3_exec返回值 
  5.  
  6. //打开一个数据库,如果该数据库不存在,则创建一个数据库文件 
  7. result = sqlite3_open("save.db", &pDB); 
  8. if( result != SQLITE_OK ) 
  9.       CCLog( "打开数据库失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); 
  10.   
  11.  //创建表,设置ID为主键,且自动增加 
  12. result=sqlite3_exec( pDB, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) ) " , NULL, NULL, &errMsg ); 
  13. if( result != SQLITE_OK ) 
  14.       CCLog( "创建表失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); 
  15.  
  16. //插入数据 
  17. sqlstr=" insert into MyTable_1( name ) values ( '克塞' ) "
  18. result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 
  19. if(result != SQLITE_OK ) 
  20.       CCLog( "插入记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); 
  21.  
  22. //插入数据 
  23. sqlstr=" insert into MyTable_1( name ) values ( '葫芦娃' ) "
  24. result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 
  25. if(result != SQLITE_OK ) 
  26.       CCLog( "插入记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); 
  27.  
  28. //插入数据 
  29. sqlstr=" insert into MyTable_1( name ) values ( '擎天柱' ) "
  30. result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 
  31. if(result != SQLITE_OK ) 
  32.       CCLog( "插入记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); 
  33.  
  34.  //关闭数据库 
  35. sqlite3_close(pDB); 


然后执行项目,你看不到什么东西,因为只是操作了数据库。

三、SQLite数据库管理工具

SQLite Database Browser是一个用Qt编写的跨平台SQLite数据库管理工具。这个工具的特点是非常简单易用, 甚至很多人拿这个修改SQLite游戏存档。(哈哈哈,关于SQLite加密问题,我们以后会讲。)
这里附上他的下载地址:

然后,我们用这个工具,打开项目目录中Resources目录下的save.db,就可以看到刚才生成的数据库数据了。
 
一共三个标签页,DataBase Structure、Browse Data,Execute SQL……意思一目了然,不用多说。是不是很好用啊,哈哈哈。


四、其他常见SQLite操作举例

还是以上面的表举例,直接给出操作代码。具体接口解释可以参考官方文档:http://www.sqlite.org/docs.html
为了突出主要内容,删掉了一些调试信息。

1)更新记录
把第三条改成威震天 

  1. sqlstr="update MyTable_1 set name='威震天' where ID = 3"
  2.  sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 

2)删除记录
把第二条葫芦娃删了 

  1. sqlstr="delete from MyTable_1 where ID = 2"
  2.  sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 

3)判断表是否存在
判断表MyTable_1是否存在,保存在isExisted_中。

  1. bool isExisted_; 
  2. sqlstr="select count(type) from sqlite_master where type='table' and name='MyTable_1'"
  3. sqlite3_exec( pDB, sqlstr.c_str() , isExisted, &isExisted_, &errMsg ); 

这里用到了一个回调函数isExisted,他的定义如下

  1. int isExisted( void * para, int n_column, char ** column_value, char ** column_name ) 
  2.             bool *isExisted_=(bool*)para; 
  3.             *isExisted_=(**column_value)!='0'
  4.             return 0; 

4)判断记录是否存在
判断ID=2的记录是否存在,保存在isExisted_中。

  1.  bool isExisted_; 
  2. sqlstr="select count(*) from MyTable_1 where ID = 2"
  3. sqlite3_exec( pDB, sqlstr.c_str() , isExisted, &isExisted_, &errMsg ); 
回调函数isExisted的定义,在3)已给出,不再赘述。

5)获得记录条数
获得表MyTable_1的记录条数,保存在count中。 

  1. int count; 
  2.  sqlstr="select * from MyTable_1"
  3.  sqlite3_exec( pDB, sqlstr.c_str() , loadRecordCount, &count, &errMsg ); 

这里用到了一个回调函数loadRecordCount,他的定义如下

  1. int loadRecordCount( void * para, int n_column, char ** column_value, char ** column_name ) 
  2.             int *count=(int*)para; 
  3.             *count=n_column; 
  4.             return 0; 
 
6)读取一条记录
读取表MyTable_1中ID=3的记录,并打印

  1. sqlstr="select * from MyTable_1 where ID=3"
  2. sqlite3_exec( pDB, sqlstr.c_str() , loadRecord, NULL, &errMsg ); 

这里用到了一个回调函数loadRecord,他的定义如下

  1. int loadRecord( void * para, int n_column, char ** column_value, char ** column_name ) 
  2.             CCLog("ID=%s,name=%s",column_value[0],column_value[1]); 
  3.             return 0; 









本文转自 老G 51CTO博客,原文链接:http://blog.51cto.com/goldlion/772518,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
冬季实战营第一期:从零到一上手玩转云服务器 | 学习报告
训练营日期:2022年1月17日 - 2022年1月23日 需要先报名后学习,实际是17-21共5天5个场景的学习,链接地址:https://developer.aliyun.com/adc/series/wintercamplist1?spm=a2c6h.26268694.J_3660455150.2.503610f8RnszVx 我是5月份学习的,并没有实时参加训练营,因为觉着本次训练营课程设置很实用,所以对本次学习做个总结。
6 0
心中有“树”!图文并茂介绍数据结构中常见的树(一)
提到数据结构中的树(Tree) ,大家应该都不陌生,相关书籍中都有大段篇幅的介绍,刷 Leetcode 的时候会遇到很多相关问题。很多人往往会用 “手写红黑树” 来形容面试难度很高。
9 0
心中有“树”!图文并茂介绍数据结构中常见的树(二)
计算机科学家尼古拉斯·沃斯(Niklaus Wirth)曾说过:编程=数据结构+算法 ,可见数据结构在编程中的重要性。
4 0
如何在小游戏制作工具中使用云函数
本节试图以最简单的方式带你了解如何在小程序后台申请和开通云开发服务,创建并编写第一个云函数并在小游戏制作工具中对其进行调用。
9 0
手撸一款简单高效的线程池(五)
在之前的内容中,我们给大家介绍了 C++实现线程池过程中的一些常用线优化方案,并分析了不同机制使用时的利弊。这一篇,是线程池系列的最后一章。我们会介绍一下 CGraph 中的 threadpool 如何使用,给出性能对比,并对接下来的工作做一些展望。让我们在线程池性能优化和功能提升的道路上,越走越远。
5 0
在函数中使用局部变量并且通过局部变量返回函数值的方案来了
感谢小游戏可视化体验官群中的一位叫做“@天羽地王”的朋友提供的思路。本文内容主要包括如何在函数中使用局部变量并且通过局部变量来返回函数的结果值。
7 0
微信小游戏推广运营专业术语汇总
本文内容包括与微信小游戏运营推广相关的专业术语的汇总和解释。作为一个游戏开发者,不光要知道如何做游戏,也要知道如何让别人玩自己做的游戏。
4 0
心中有“树”!图文并茂介绍数据结构中常见的树(三)
在前面两篇文章中,我们简要介绍了数据结构中的各种【树】在搜索、数据库等领域的使用场景,希望对大家有所帮助。
10 0
21117
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载