cocos2d-x使用easySqlite数据库框架跨Win32&Android平台貌似试验成功

  • 本帖最后由 奇思精彩 于 2012-11-21 12:28 编辑 *

    刚学cocos2d-x,所以第一件事就是玩转数据库啊数据库,无奈官方test没有数据库演示程序。cocos2d是使用FMDatabase框架访问Sqlite数据库(可惜不支持2d-x的C++语言)。目前C++版的Sqlite封装框架有多种:
    http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers

    我选择的是easySQLite:http://code.google.com/p/easysqlite/
    easySQLite框架基于键值对的存储方式访问数据库,我很喜欢,但是坑爹的是有少部分代码依赖微软的非标准C++库。经过小幅兼容性修改之后,貌似可以顺利在Android平台编译,但是本人刚学C++,严重担心自己修改的对不对,请各位大大们帮忙看看:(只差这一步就可以在Win32&Android上放心畅快使用SQLite了(:slight_smile:) )

741
(↑左侧为原始文件,右侧红色为我修改之后的文件)

743
744
(↑SqlCommon.cpp)微软C++库中特有的函数localtime_s(&localtime, &_value)
我在标准C++库中找到一个参数相反的函数叫做localtime_r(&_value, &localtime)
不知是否可以这样写?

745
(↑SqlDatabase.cpp)
微软C++库中特有的函数_tzset()
我在标准C++库中找到一个函数叫做tzset()
不知是否可以这样写?

746
(↑SqlFieldSet.cpp)
左侧在VS2008上编译通过,
可是在cygwin上编译失败,必须改写成右侧这样,不知何故。

747
748
749
(↑SqlValue.cpp)
左侧的_atoi64和_i64toa函数好像不是标准C++库函数,我在cygwin上编译失败,改成右侧这样才编译通过。

但是我不知道_atoi64是应该改写成atol还是atoll?写成atoll的话微软VS2008又不识别了。
另外,_i64toa写成sprintf可以吗?其中应该使用"%d"还是"%ld"还是别的什么?

我的C++基础太肤浅,求C++高手帮一把了。
待这几个函数鉴定通过之后,我会发出cocos2d-x结合esaySQLite的跨平台演示DEMO。

对于_i64toa_s,根据http://technet.microsoft.com/zh-cn/windowsserver/0we9x30h(vs.90).aspx ,http://baike.baidu.com/view/1235293.htm ,在window环境下,应该是"%I64d";在mac环境下,应该是"%lld"。

对于_itoa_s,摘自http://bbs.csdn.net/topics/120024558:“不用_itoa_s,直接itoa就成。_itoa_s只不过在字符串上多下了些功夫,避免出现一些程序员疏忽的错误。只要自己对字符串和转化的数值拿捏的恰当,用不用_itoa_s都一样。”

以下顺便附上我这个新手这两天遇到的3个问题:

★在Android平台使用C语言版的sqlite数据库时,不可直接写db.open("test.db"),需要在文件名前加上相对路径,这样就可以在安卓上正常打开数据库了,哦也:
std::string path = CCFileUtils::sharedFileUtils()->getWriteablePath() + "test.db";
db.open(path.c_str());

★中文编码问题。这篇帖子写的很详细:http://blog.csdn.net/tkokof1/article/details/7426706

但是我实践的情况感觉,还是直接将.h .c .cpp文本转码为UTF-8比较省事。唯一要注意的就是Win32上打印中文字符串必须写偶数个汉字,写成奇数个汉字时,最后一个汉字会变成问号。安卓平台都是正常的。(cocos2d-2.0-x-2.0.4版本)

★在Android平台无法使用CCLOG打印的话,可以直接使用CCLog打印调试信息。

我明明已经在cpp代码头部写了
#define COCOS2D_DEBUG 1
可还是无法用CCLOG打印,求解释。

谢谢专业的C/C++高手指点啊,帮大忙了!