热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

加密数据库cocos2d-xsqlite的使用,数据库操作的封装

工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下加密数据库本篇博客出自阿修罗道,转载请注明出处:http:blog.csdn.netfa

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

    

    

本篇博客出自阿修罗道,转载请注明出处: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就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
倒退淂磁带_628
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有