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: 删除表成功!
原创粉丝点击