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加密。
对外接口我留了以下几个:
- public:
- /*
- *打开数据库。
- *
- *tableName为创建的表名,自检是否存在
- *changedKey为变更的密钥,默认为字段SEC_KEY,也可更改。
- *
- *返回为sqlITE_XXX标准宏
- *byfansy2013-5-13
- */
- intopenDB(std::stringdbName,std::stringtableName,std::stringchangedKey="");
- //关闭数据库
- voidcloseDB();
- /*
- *存数据,自检是否存在,不会重复。最后一个变量表示是否加密
- *
- *返回为sqlITE_XXX标准宏
- *byfansy2013-5-13
- */
- intsetValue(std::stringkey,std::stringvalue,boolisImportantValue=DEFULAT_SECURITY);
- intsetValue(std::stringkey,intvalue,boolisImportantValue=DEFULAT_SECURITY);
- intsetValue(std::stringkey,longlongvalue,boolisImportantValue=DEFULAT_SECURITY);
- /*
- *取数据,变量结果存入Value中,最后一个变量表示是否加密
- *
- *返回为sqlITE_XXX标准宏
- *byfansy2013-5-13
- */
- intgetValue(std::stringkey,std::string&value,boolisImportantValue=DEFULAT_SECURITY);
- intgetValue(std::stringkey,int&value,boolisImportantValue=DEFULAT_SECURITY);
- intgetValue(std::stringkey,longlong&value,boolisImportantValue=DEFULAT_SECURITY);
- /*
- *删除数据
- *
- *返回为sqlITE_XXX标准宏
- *byfansy2013-5-13
- */
- intdeleteValue(conststd::stringkey,boolisImportantValue=DEFULAT_SECURITY);
public: /* * 打开数据库。 * * tableName 为创建的表名,自检是否存在 * changedKey 为变更的密钥,默认为字段SEC_KEY,也可更改。 * * 返回为sqlITE_XXX标准宏 * by fansy 2013-5-13 */ int openDB(std::string dbName,std::string tableName,std::string changedKey = ""); //关闭数据库 void closeDB(); /* * 存数据,自检是否存在,不会重复。最后一个变量表示是否加密 * * 返回为sqlITE_XXX标准宏 * by fansy 2013-5-13 */ int setValue(std::string key,std::string value,bool isImportantValue = DEFULAT_SECURITY); int setValue(std::string key,int value,long long value,bool isImportantValue = DEFULAT_SECURITY); /* * 取数据,变量结果存入Value中,最后一个变量表示是否加密 * * 返回为sqlITE_XXX标准宏 * by fansy 2013-5-13 */ int getValue(std::string key,std::string& value,bool isImportantValue = DEFULAT_SECURITY); int getValue(std::string key,int& value,long long& value,bool isImportantValue = DEFULAT_SECURITY); /* * 删除数据 * * 返回为sqlITE_XXX标准宏 * by fansy 2013-5-13 */ int deleteValue(const std::string key,bool isImportantValue = 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”。通过对 “ :”字符的检查,来判断键是否是在默认的表中。不是,则在相应的表中操作相应的值。如果有个新用户,就新建一个数据库好了。这样即使总增加新的属性,也能灵活的存取,不受先前表结构的影响。
大体实现如下:
- intDataUtil::openDB(std::stringdbName,std::stringchangedKey/*=""*/)
- {
- intresult=1;
- result=DataUtil::Instance()->initDB(dbName.c_str(),changedKey);
- if(result==sqlITE_OK)
- {
- result=DataUtil::createTable(tableName);
- if(result==sqlITE_OK)
- {
- m_tableName=tableName;
- }
- }
- returnresult;
- }
- intDataUtil::setValue(std::stringkey,boolisImportantValue/*=true*/)
- {
- intresult=1;
- std::stringforeData;
- DataUtil::Instance()->getValue(m_tableName,key,foreData,isImportantValue);
- if(foreData.empty())
- {
- result=DataUtil::Instance()->insertValue(m_tableName,value,isImportantValue);
- }
- else
- {
- result=DataUtil::Instance()->updateValue(m_tableName,isImportantValue);
- }
- returnresult;
- }
- intDataUtil::setValue(std::stringkey,boolisImportantValue/*=true*/)
- {
- charres[10];
- _itoa_s(value,res,10);
- returnDataUtil::Instance()->setValue(key,isImportantValue);
- }
- intDataUtil::setValue(std::stringkey,boolisImportantValue/*=true*/)
- {
- charres[20];
- //_ltoa_s(value,10);
- sprintf_s(res,"%%I64d",value);
- returnDataUtil::Instance()->setValue(key,isImportantValue);
- }
- intDataUtil::getValue(std::stringkey,boolisImportantValue/*=true*/)
- {
- intresult=1;
- std::stringtmpValue;
- result=DataUtil::Instance()->getValue(m_tableName,tmpValue,isImportantValue);
- if(result==sqlITE_OK)
- {
- value=tmpValue;
- }
- returnresult;
- }
- intDataUtil::getValue(std::stringkey,boolisImportantValue/*=true*/)
- {
- std::stringtempValue;
- intresult=DataUtil::Instance()->getValue(key,tempValue,isImportantValue);
- if(result==sqlITE_OK)
- {
- value=atoi(tempValue.c_str());
- }
- returnresult;
- }
- intDataUtil::getValue(std::stringkey,isImportantValue);
- if(result==sqlITE_OK)
- {
- value=atol(tempValue.c_str());
- }
- returnresult;
- }
- intDataUtil::deleteValue(conststd::stringkey,boolisImportantValue/*=DEFULAT_SECURITY*/)
- {
- returnDataUtil::Instance()->deleteValue(m_tableName,isImportantValue);
- }
int DataUtil::openDB(std::string dbName,std::string changedKey/* = ""*/) { int result = 1; result = DataUtil::Instance()->initDB(dbName.c_str(),changedKey); if (result == sqlITE_OK) { result = DataUtil::createTable(tableName); if (result == sqlITE_OK) { m_tableName = tableName; } } return result; } int DataUtil::setValue(std::string key,bool isImportantValue /* = true */) { int result = 1; std::string foreData; DataUtil::Instance()->getValue(m_tableName,isImportantValue); if (foreData.empty()) { result = DataUtil::Instance()->insertValue(m_tableName,isImportantValue); } else { result = DataUtil::Instance()->updateValue(m_tableName,isImportantValue); } return result; } int DataUtil::setValue(std::string key,bool isImportantValue /* = true */) { char res[10]; _itoa_s(value,10); return DataUtil::Instance()->setValue(key,isImportantValue); } int DataUtil::setValue(std::string key,bool isImportantValue /* = true */) { char res[20]; //_ltoa_s(value,10); sprintf_s(res,"%%I64d",value); return DataUtil::Instance()->setValue(key,isImportantValue); } int DataUtil::getValue(std::string key,std::string &value,bool isImportantValue /* = true */) { int result = 1; std::string tmpValue; result = DataUtil::Instance()->getValue(m_tableName,isImportantValue); if (result == sqlITE_OK) { value = tmpValue; } return result; } int DataUtil::getValue(std::string key,bool isImportantValue /* = true */) { std::string tempValue; int result = DataUtil::Instance()->getValue(key,isImportantValue); if (result == sqlITE_OK) { value = atoi(tempValue.c_str()); } return result; } int DataUtil::getValue(std::string key,isImportantValue); if (result == sqlITE_OK) { value = atol(tempValue.c_str()); } return result; } int DataUtil::deleteValue(const std::string key,bool isImportantValue /* = DEFULAT_SECURITY */ ) { return DataUtil::Instance()->deleteValue(m_tableName,isImportantValue); }
如有大家觉得不恰当的地方,欢迎留言共同讨论 。