Cocos2d-X之游戏存储Sqlite高级篇(四)
来源:互联网 发布:深度优化dnf客户端 编辑:程序博客网 时间:2024/05/23 01:19
同样的内容,相对于基础篇,代码编写效率提高了很多。
省去了stmt句柄,并且将Sql语句集成到sqlite3_exec()方法之中。
同样学习了C语言强大的atof()函数,直接将字符串转成 double型,还有sprintf(),将int型转换成char 型,神器啊,解决了我当年思考的问题。
还有一个问题要注意,char * 在xcode里面不被支持,所以 sprintf() 方法使用的时候,请将char *sum 改为 char sum[n],否则会造成没存读取错误。
2013-07-1 09:38:11.290:
最近使用sqlite发现一个很纠结的问题,就是在不同方法里面调用修改数据的时候,一定要记得打开数据库。
2013-07-10 09:38:11.290:
今天发现一个使用sqlite一定要注意的内存管理问题,那就是打开数据库之后,数据操作完成之后,一定要关闭数据库,否侧会造成内存泄漏。
看下,查询sqlite表的数据返回:
As an example of the result table format, suppose a query result is as follows:
Name | Age-----------------------Alice | 43Bob | 28Cindy | 21
There are two column (M==2) and three rows (N==3). Thus the result table has 8 entries. Suppose the result table is stored in an array names azResult. Then azResult holds this content:
azResult[0] = "Name";azResult[1] = "Age";azResult[2] = "Alice";azResult[3] = "43";azResult[4] = "Bob";azResult[5] = "28";azResult[6] = "Cindy";azResult[7] = "21";
2013-07-12 14:46:06.037:
这里需要查询表是否存在,看了几篇文章,感觉啰嗦的很,远不如自己来的巧妙,嘎嘎,
myPrizeList没有创建,myPrize创建成功。
执行下面代码会返回执行代码的返回值。
#define SQLITE_ERROR 1 /* SQL error or missing database */
根据执行语句返回值,来判断表是否存在,返回1有数据库错误和sql语句本身语法错误2种,排除数据库错误
和sql语句语法错误,那么只能说明表不存在,嘎嘎
int result2 = sqlite3_exec(this->mySqlite,"select count(*) from myPrizeList", NULL,NULL,NULL);
CCLog("%d",result2);
输出 1,排除其他的错误后,表不存在
int result3 =sqlite3_exec(this->mySqlite,"select count(*) from myPrize", NULL,NULL,NULL);
CCLog("%d",result3);
输出 0,表存在
下面直接看代码:
void HelloWorld::doTest(){ //1.新建数据库mySqlite sqlite3 *mySqlite = NULL; //sql语句执行后的返回结果 int result; //sql操作语句 std::string sql; //数据库存放的地址,是在本地的app下面, std::string path; //CCFileUtils::sharedFileUtils()->getWritablePath()这个方法会取出本地存储路径,将 //我们的数据库存放到app下面 path = CCFileUtils::sharedFileUtils()->getWritablePath()+"mySqlite.db"; //输出看下数据库的文件路径 CCLOG("%s",path.c_str()); //打开数据库mySqlite,没有就自动创建一个 result = sqlite3_open(path.c_str(), &mySqlite); //SQLITE_OK宏定义为数字0 if (result != SQLITE_OK) { CCLOG("打开数据库失败!"); } else{ CCLOG("创建数据库成功!"); } //2.使用sqlite3_exec()创建一个表myTable,比起句柄stmt,提高了好多效率 //有字段号码,分数,简介和名字 result = sqlite3_exec(mySqlite,"create table myTable (NO_col INTERGER ,score_col REAL ,brief_col TEXT,name_col TEXT)", NULL, NULL, NULL); if (result != SQLITE_OK) { CCLOG("创建表失败!"); } else{ CCLOG("创建表成功!"); } //3.插入数据 result = sqlite3_exec(mySqlite, "insert into myTable values(80,100,'这是第一次测试','我的名字叫kevin')", NULL, NULL, NULL); if (result != SQLITE_OK) { CCLOG("插入数据失败!"); }else { CCLOG("插入数据成功!"); } result = sqlite3_exec(mySqlite, "insert into myTable values(60,90,'这是第二个测试','我的名字叫kevin')", NULL, NULL, NULL); if (result != SQLITE_OK) { CCLOG("插入数据失败!"); }else { CCLOG("插入数据成功!"); } //4.查询数据 //二级指针,存放指针的地址,一维数组 char **re; int r,c; //查询表中的全部内容 result = sqlite3_get_table(mySqlite, "select * from myTable", &re, &r, &c, NULL); if (result != SQLITE_OK) { CCLOG("查询表失败!"); }else { CCLOG("查询表成功!"); } //输出行数和列数 CCLOG("表中的数据有%d行, 表中的数据有%d列",r,c); //在表中共有字段一行,和两行数据,共3行,4列,12个单元 for (int count=0; count< (r+1)*c ;count ++) { CCLOG("%s :%d",re[count],count); } //这里使用到C语言函数库的一个强大函数,可以直接将字符串类型转换成整型,浮点型等数学类型 /* atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转换成长整型数) strtod(将字符串转换成浮点数) strtol(将字符串转换成长整型数) strtoul(将字符串转换成无符号长整型数) toascii(将整型数转换成合法的ASCII 码字符) toupper(将小写字母转换成大写字母) tolower(将大写字母转换成小写字母)*/ CCLOG("Kevin 的分数是%s",re[5]); CCLOG("Lisa 的分数是%s",re[9]); int sum = atoi(re[5])+atoi(re[9]); CCLOG("总分数是 %d",sum); //将char *sumChar 换成char sumChar[10],为了在C++中被支持,否侧造成内存读取错误 char sumChar[10] ; //使用sprintf()函数将int型转换成字符型 sprintf(sumChar,"%d",sum); CCLOG("总分数是 %s",sumChar); //5.修改数据,将第二个测试名字改为Lisa //"update myTable set name_col ='name' where NO_col = 60 " std::string name = "Lisa"; std::string update = "update myTable set name_col = "; std::string condition = " where NO_col = 60"; update=update+"'"+name+"'"+condition; std::cout<<"Cocos2d: "<<update<<std::endl; //使用c——str()将string转换成char * //char *updateName = (char *)update.c_str(); result = sqlite3_exec(mySqlite,update.c_str() , NULL, NULL, NULL); if (result != SQLITE_OK) { CCLOG("修改名称为Lisa失败!"); }else { CCLOG("修改名称为Lisa成功!"); } //修改Lisa分数为88 result = sqlite3_exec(mySqlite, "update myTable set score_col = 88 where NO_col=60", NULL, NULL, NULL); if (result != SQLITE_OK) { CCLOG("修改Lisa分数失败!"); }else { CCLOG("修改Lisa分数成功!"); } CCLOG("修改表后查询!"); //查询表中的全部内容 char **re1; int r1,c1; result = sqlite3_get_table(mySqlite, "select * from myTable ", &re1, &r1, &c1, NULL); if (result != SQLITE_OK) { CCLOG("查询表失败!"); }else { CCLOG("查询表成功!"); } //输出行数和列数 CCLOG("修改后表中的数据有%d行, 表中的数据有%d列",r1,c1); CCLOG("Kevin 的分数是%s",re1[5]); CCLOG("Lisa 的分数是%s",re1[9]); int sum1 = atoi(re1[5])+atoi(re1[9]); CCLOG("总分数是 %d",sum1); //在表中共有字段一行,和两行数据,共3行,4列,12个单元 for (int count=0; count< (r1+1)*c1 ;count ++) { if (re1[count]==NULL) { CCLOG("I Love You"); } CCLOG("%s",re1[count]); } //6.删除表 result = sqlite3_exec(mySqlite, "drop table myTable", NULL, NULL, NULL); if (result != SQLITE_OK) { CCLOG("删除表失败!"); }else { CCLOG("删除表成功!"); } //关闭数据库,否则会造成内存泄漏 sqlite3_close(mySqlite);}
好的,下面看下结果:
2013-07-10 09:59:54.069 template[1244:c07] cocos2d: surface size: 960x640Cocos2d: <dict>cocos2d.x.version: 2.1rc0-x-2.1.4cocos2d.x.compiled_with_profiler: falsecocos2d.x.compiled_with_gl_state_cache: truegl.vendor: Apple Computer, Inc.gl.renderer: Apple Software Renderergl.version: OpenGL ES 2.0 APPLEgl.max_texture_size: 4096gl.max_texture_units: 8gl.max_samples_allowed: 4gl.supports_PVRTC: truegl.supports_NPOT: truegl.supports_BGRA8888: falsegl.supports_discard_framebuffer: truegl.supports_vertex_array_object: true</dict>Cocos2d: /Users/mac/Library/Application Support/iPhone Simulator/6.1/Applications/C446E7F1-58A7-4957-95E6-73EB863A87BF/Documents/mySqlite.dbCocos2d: 创建数据库成功!Cocos2d: 创建表成功!Cocos2d: 插入数据成功!Cocos2d: 插入数据成功!Cocos2d: 查询表成功!Cocos2d: 表中的数据有2行, 表中的数据有4列Cocos2d: NO_col :0Cocos2d: score_col :1Cocos2d: brief_col :2Cocos2d: name_col :3Cocos2d: 80 :4Cocos2d: 100.0 :5Cocos2d: 这是第一次测试 :6Cocos2d: 我的名字叫kevin :7Cocos2d: 60 :8Cocos2d: 90.0 :9Cocos2d: 这是第二个测试 :10Cocos2d: 我的名字叫kevin :11Cocos2d: Kevin 的分数是100.0Cocos2d: Lisa 的分数是90.0Cocos2d: 总分数是 190Cocos2d: 总分数是 190Cocos2d: update myTable set name_col = 'Lisa' where NO_col = 60Cocos2d: 修改名称为Lisa成功!Cocos2d: 修改Lisa分数成功!Cocos2d: 修改表后查询!Cocos2d: 查询表成功!Cocos2d: 修改后表中的数据有2行, 表中的数据有4列Cocos2d: Kevin 的分数是100.0Cocos2d: Lisa 的分数是88.0Cocos2d: 总分数是 188Cocos2d: NO_colCocos2d: score_colCocos2d: brief_colCocos2d: name_colCocos2d: 80Cocos2d: 100.0Cocos2d: 这是第一次测试Cocos2d: 我的名字叫kevinCocos2d: 60Cocos2d: 88.0Cocos2d: 这是第二个测试Cocos2d: LisaCocos2d: 删除表成功!
- Cocos2d-X之游戏存储Sqlite高级篇(四)
- Cocos2d-X之游戏存储Sqlite高级篇(四)(转)
- Cocos2d-X之游戏存储Sqlite基础篇(四)
- Cocos2d-X之游戏存储Sqlite基础篇(四)
- 【cocos2d-x游戏开发】 从零单排之(四)
- Cocos2d—X游戏开发之CCEditBox(虚拟键盘高级篇)(十)
- 【iOS-cocos2d-X 游戏开发之四】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码
- Cocos2d—X游戏开发之LibCurl高级篇(get,post服务器数据)(网络详细参数信息)
- Cocos2d-X游戏开发(四)
- 游戏开发教程cocos2d-x移植之四
- Cocos2D-x游戏开发之四:CCScale9Sprite and CCControlButton
- cocos2d-x 游戏开发之有限状态机(FSM) (四)
- Cocos2d-x游戏开发之CCUserDefault类存储详解
- 【Cocos2d-X游戏实战开发】捕鱼达人之菜单按钮的创建(四)
- cocos2d-x游戏开发(一)之环境搭建篇
- cocos2d-x 数据存储 Sqlite数据库
- Cocos2d-x游戏开发之CCLabelTTF标签详解之Create方法(设置自动换行的标签)和换行符的巧妙使用(十六)(高级篇)
- cocos2d-x塔防游戏教程(四)
- Android OTA 升级(五):updater
- Spring的事务处理机制 ---以及spring整合hibernate事务管理配置
- 在EBS环境中启用Trace
- myeclipse优化方案 myeclipse 10 优化
- int char* CString BSTR jstring类型转换
- Cocos2d-X之游戏存储Sqlite高级篇(四)
- 不同版本flash builder共用工作空间导致无法运行
- asp.net等待的响应的时间比较长
- 现在能意识到晚,就不算晚。
- 公司面试题——线程数组求和
- Bootloader - Main system - Recovery的三角关系
- jquery $(document).ready() 与window.onload的区别
- 使用Progurad工具混淆代码 保留内部类并正常调用
- Android中通过xml资源文件定义数组