cocos2d-x sqlite的使用,数据库操作的封装

From: http://www.jb51.cc/article/p-yyfbfsin-eg.html

本篇博客出自阿修罗道,转载请注明出处:http://www.jb51.cc/article/p-yyfbfsin-eg.html

移动平台要用到sqllite,发现cocos2d-x中没有专门的类对接。为了以后省事,就自己写了个封装。

数据库的形式是Key-Value。如果某种类的数据项过多,可以将大类作为表名,以便将来的拓展。

加密方面采用的是数据项加密。加密方式是DES加密。


对外接口我留了以下几个:

  1. public:
  2. /*
  3. *打开数据库。
  4. *
  5. *tableName为创建的表名,自检是否存在
  6. *changedKey为变更的密钥,默认为字段SEC_KEY,也可更改。
  7. *
  8. *返回为SQLITE_XXX标准宏
  9. *byfansy2013-5-13
  10. */
  11. intopenDB(std::stringdbName,std::stringtableName,std::stringchangedKey="");
  12. //关闭数据库
  13. voidcloseDB();
  14. /*
  15. *存数据,自检是否存在,不会重复。最后一个变量表示是否加密
  16. *
  17. *返回为SQLITE_XXX标准宏
  18. *byfansy2013-5-13
  19. */
  20. intsetValue(std::stringkey,std::stringvalue,boolisImportantValue=DEFULAT_SECURITY);
  21. intsetValue(std::stringkey,intvalue,boolisImportantValue=DEFULAT_SECURITY);
  22. intsetValue(std::stringkey,longlongvalue,boolisImportantValue=DEFULAT_SECURITY);
  23. /*
  24. *取数据,变量结果存入Value中,最后一个变量表示是否加密
  25. *
  26. *返回为SQLITE_XXX标准宏
  27. *byfansy2013-5-13
  28. */
  29. intgetValue(std::stringkey,std::string&value,boolisImportantValue=DEFULAT_SECURITY);
  30. intgetValue(std::stringkey,int&value,boolisImportantValue=DEFULAT_SECURITY);
  31. intgetValue(std::stringkey,longlong&value,boolisImportantValue=DEFULAT_SECURITY);
  32. /*
  33. *删除数据
  34. *
  35. *返回为SQLITE_XXX标准宏
  36. *byfansy2013-5-13
  37. */
  38. intdeleteValue(conststd::stringkey,boolisImportantValue=DEFULAT_SECURITY);

首先,打开数据库,打开表应该是一个需求,就写到一起了。这里可以更改加密的密钥,不过要注意,密钥长度为16时系统自动使用3次DES加/解密,超过16字节后只取前24字节;为大于等于8小于24时使用标准DES加/解密,其它返回失败。所以建议使用16位。

关闭倒是没什么可说的。

存取的设计也比较简明。getValue和setValue就是读和取相应key的Value。重载了三个函数,分别是string、int、和int64的。第三个参数表示是否需要加密。DEFAULT_SECURITY这个字段表示默认是否采用加密。可以在测试的过程中将默认加密关上,发布时在打开。

删除数据就是一个键来删除。

这里有个要注意的地方。这套接口中其实是没有“表”这个概念的。可以简单的理解为所有的数据都是存在同一个表中的。即“openDB”时输入的默认表。

但这个结构是可以拓展的。比如随着游戏的复杂性增加,需要有背包。背包的信息需要单独存入一个表中。这时,在set\get Vaule时可以传入“player:maxCount”。通过对 “ :”字符的检查,来判断键是否是在默认的表中。不是,则在相应的表中操作相应的值。如果有个新用户,就新建一个数据库好了。这样即使总增加新的属性,也能灵活的存取,不受先前表结构的影响。


大体实现如下:

  1. intDataUtil::openDB(std::stringdbName,std::stringchangedKey/*=""*/)
  2. {
  3. intresult=1;
  4. result=DataUtil::Instance()->initDB(dbName.c_str(),changedKey);
  5. if(result==SQLITE_OK)
  6. {
  7. result=DataUtil::createTable(tableName);
  8. if(result==SQLITE_OK)
  9. {
  10. m_tableName=tableName;
  11. }
  12. }
  13. returnresult;
  14. }
  15. intDataUtil::setValue(std::stringkey,boolisImportantValue/*=true*/)
  16. {
  17. intresult=1;
  18. std::stringforeData;
  19. DataUtil::Instance()->getValue(m_tableName,key,foreData,isImportantValue);
  20. if(foreData.empty())
  21. {
  22. result=DataUtil::Instance()->insertValue(m_tableName,value,isImportantValue);
  23. }
  24. else
  25. {
  26. result=DataUtil::Instance()->updateValue(m_tableName,isImportantValue);
  27. }
  28. returnresult;
  29. }
  30. intDataUtil::setValue(std::stringkey,boolisImportantValue/*=true*/)
  31. {
  32. charres[10];
  33. _itoa_s(value,res,10);
  34. returnDataUtil::Instance()->setValue(key,isImportantValue);
  35. }
  36. intDataUtil::setValue(std::stringkey,boolisImportantValue/*=true*/)
  37. {
  38. charres[20];
  39. //_ltoa_s(value,10);
  40. sprintf_s(res,"%%I64d",value);
  41. returnDataUtil::Instance()->setValue(key,isImportantValue);
  42. }
  43. intDataUtil::getValue(std::stringkey,boolisImportantValue/*=true*/)
  44. {
  45. intresult=1;
  46. std::stringtmpValue;
  47. result=DataUtil::Instance()->getValue(m_tableName,tmpValue,isImportantValue);
  48. if(result==SQLITE_OK)
  49. {
  50. value=tmpValue;
  51. }
  52. returnresult;
  53. }
  54. intDataUtil::getValue(std::stringkey,boolisImportantValue/*=true*/)
  55. {
  56. std::stringtempValue;
  57. intresult=DataUtil::Instance()->getValue(key,tempValue,isImportantValue);
  58. if(result==SQLITE_OK)
  59. {
  60. value=atoi(tempValue.c_str());
  61. }
  62. returnresult;
  63. }
  64. intDataUtil::getValue(std::stringkey,isImportantValue);
  65. if(result==SQLITE_OK)
  66. {
  67. value=atol(tempValue.c_str());
  68. }
  69. returnresult;
  70. }
  71. intDataUtil::deleteValue(conststd::stringkey,boolisImportantValue/*=DEFULAT_SECURITY*/)
  72. {
  73. returnDataUtil::Instance()->deleteValue(m_tableName,isImportantValue);
  74. }

如有大家觉得不恰当的地方,欢迎留言共同讨论

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...