zoukankan      html  css  js  c++  java
  • 加密数据库cocos2dx sqlite的使用,数据库操作的封装

    工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下加密数据库

        

        

    本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8922054

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

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

            加密方面采取的是数据项加密。加密方法是DES加密。

        

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

        

    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,bool isImportantValue = DEFULAT_SECURITY);
    	int setValue(std::string key,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,bool isImportantValue = DEFULAT_SECURITY);
    	int getValue(std::string key,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”。通过对 “ :”字符的检查,来判断键是不是是在默许的表中。不是,则在相应的表中操作相应的值。如果有个新用户,就新建一个数据库好了。这样即使总增加新的属性,也能灵巧的存取,不受先前表结构的影响。

        

        大体实现如下:

        

    int DataUtil::openDB(std::string dbName,std::string tableName,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,std::string value,bool isImportantValue /* = true */)
    {
    	int result = 1;
    	std::string foreData;
    	DataUtil::Instance()->getValue(m_tableName,key,foreData,isImportantValue);
    	if (foreData.empty())
    	{
    		result = DataUtil::Instance()->insertValue(m_tableName,key,value,isImportantValue);
    	}
    	else
    	{
    		result = DataUtil::Instance()->updateValue(m_tableName,key,value,isImportantValue);
    	}
    	return result;
    }
    int DataUtil::setValue(std::string key,int value,bool isImportantValue /* = true */)
    {
    	char res[10];
    	_itoa_s(value,res,10);
    	return DataUtil::Instance()->setValue(key,res,isImportantValue);
    }
    
    int DataUtil::setValue(std::string key,long long value,bool isImportantValue /* = true */)
    {
    	char res[20];
    	//_ltoa_s(value,res,10);
    	sprintf_s(res,"%%I64d",value);
    	return DataUtil::Instance()->setValue(key,res,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,key,tmpValue,isImportantValue);
    	if (result == SQLITE_OK)
    	{
    		value = tmpValue;
    	}
    	return result;
    }
    int DataUtil::getValue(std::string key,int& value,bool isImportantValue /* = true */)
    {
    	std::string tempValue;
    	int result = DataUtil::Instance()->getValue(key,tempValue,isImportantValue);
    	if (result == SQLITE_OK)
    	{
    		value = atoi(tempValue.c_str());
    	}
    	return result;
    }
    int DataUtil::getValue(std::string key,long long& value,bool isImportantValue /* = true */)
    {
    	std::string tempValue;
    	int result = DataUtil::Instance()->getValue(key,tempValue,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,key,isImportantValue);
    }

       

        如有大家觉得不适当的地方,欢送留言独特讨论

        。

        

           

    文章结束给大家分享下程序员的一些笑话语录: 苹果与谷歌之争就是封闭收费与自由免费思想之争。(别急着把google来膜拜哦?那可是一家公司,以赚钱为目标的公司!当年我Party就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)

  • 相关阅读:
    iOS拓展---[转载]视频相关,一定要看呀
    iOS拓展---碰到奇葩需求
    iOS拓展---【转载】成熟的夜间模式解决方案
    2018年度总结
    linux常用命令
    自我认识
    SpringBoot入门最详细教程
    SVN分支的合并和同步
    java Data、String、Long三种日期类型之间的相互转换
    徐胜治:我要留下真正的东西
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3076609.html
Copyright © 2011-2022 走看看