一、UserDefault
UserDefault的使用
UserDefault:Cocos2d-x自带的存储数据的类,可以存储比较小的数据。UserDefault是一个单例,我们可以通过:UserDefault::getInstance();来获得这个类的实例。UserDefault使用哈希表结构,Key-Value,Key索引,Value值。
UserDefault* hero = UserDefault::getInstance();
hero->setStringForKey("username", "wanghang");
hero->setBoolForKey("musicIsOn", false);
hero->setIntegerForKey("coin", 100);
hero->flush();
log("%s",hero->getXMLFilePath().c_str());
数据保存在Library/Preferences/xx.xx.xx.plist中,我们通过 输出的路径一直是Library/Caches/UserDefault.xml. 所以,我们通过
log("%s",UserDefault::getInstance()->getXMLFilePath().c_str());
UserDefault::getInstance()->isXMLFileExist()判断文件是否存在,我们得到的结果一直是不存在的。UserDefault保存数据没有加密,如果要加密,需要自己实现,可以使用base64等。
UserDefault的常用方法:
UserDefault* hero = UserDefault::getInstance();
hero->setStringForKey("username", "wanghang");
hero->setBoolForKey("musicIsOn", false);
hero->setIntegerForKey("coin", 100);
hero->flush();
log("%s",hero->getXMLFilePath().c_str());
std::string name = hero->getStringForKey("username");
bool music = hero->getBoolForKey("musicIsOn");
int coin = hero->getIntegerForKey("coin");
log("name: %s",name.c_str());
log("musicIsOn: %d",music);
log("coin: %d",coin);
二、文件路径(文件拷贝到可读写文件夹下)
我们在做iOS开发时,我们应用程序里面的,也就是我们真机中的cpp文件是只读的。如果我们要修改文件,需要将文件拷贝到一个可读可写的文件夹下,然后再修改。
//获取可以写的路径
std::string filename = "data.xml";//data.xml就是你的文件名字
FileUtils* fu = FileUtils::getInstance();
std::string writeAblePath = fu->getWritablePath();
//拼接路径(documents下的路径)
std::string xmlPath = writeAblePath+filename;
log("%s",writeAblePath.c_str());
if (!fu->isFileExist(writeAblePath)) {
std::string dataPath = fu->fullPathForFilename(filename);
std::string data = fu->getStringFromFile(data);
FILE* file = fopen(writeAblePath.c_str(), "w");
if (file) {
fputs(data.c_str(), file);
fclose(file);
}
}
三、rapidjson
在使用rapidjson前的准备
#include "json/rapidjson.h"
#include "json/document.h"
#include "json/writer.h"
#include "json/stringbuffer.h"
using namespace rapidjson;
我在电脑中随便找了个json类型的文件,名称为”version.json”,copy到Resources文件夹下。具体内容如下
{
"prebuilt_libs_version":"v3-deps-31",
"freetype":"2.5.0",
"curl":"7.39.0",
"jpeg":"9.0",
"png":"1.6.2",
"tiff":"4.0.3",
"webp":"0.2.1",
"websockets":"v1.23-chrome32-firefox24"
}
接下来,我们将使用rapidjson来解析这个文件,具体代码如下。(注意,在解析前,把这个json文件利用上面的方式拷贝到可读可写文件夹下。)
//获取路径
FileUtils* fu = FileUtils::getInstance();
std::string writeAblePath = fu->getWritablePath();
writeAblePath += "version.json";
log("writer: %s",writeAblePath.c_str());
//读取
rapidjson::Document doc;
std::string data = fu->getStringFromFile(writeAblePath);
doc.Parse<rapidjson::kParseDefaultFlags>(data.c_str());
if (doc.HasParseError()) {
return;
}
if (doc.HasMember("prebuilt_libs_version")) {
rapidjson::Value &prebuilt_libs_version = doc["prebuilt_libs_version"];
log("prebuilt_libs_version: %s",prebuilt_libs_version.GetString());
}
if (doc.HasMember("freetype")) {
rapidjson::Value &freetype = doc["freetype"];
log("freetype :%s",freetype.GetString());
}
if (doc.HasMember("curl")) {
rapidjson::Value &curl = doc["curl"];
log("curl :%s",curl.GetString());
}
if (doc.HasMember("jpeg")) {
rapidjson::Value &jpeg = doc["jpeg"];
log("jpeg :%s",jpeg.GetString());
}
if (doc.HasMember("png")) {
rapidjson::Value &png = doc["png"];
log("png :%s",png.GetString());
}
if (doc.HasMember("tiff")) {
rapidjson::Value &tiff = doc["tiff"];
log("tiff :%s",tiff.GetString());
}
if (doc.HasMember("webp")) {
rapidjson::Value &webp = doc["webp"];
log("webp :%s",webp.GetString());
}
if (doc.HasMember("websockets")) {
rapidjson::Value &websockets = doc["websockets"];
log("websockets :%s",websockets.GetString());
}
另外,rapidjson还提供了添加,修改和删除的方法
//添加
doc.AddMember("class", "nine", doc.GetAllocator());
//修改
doc["png"].SetString("change");
//删除
doc.RemoveMember("jpeg");
rapidjson::StringBuffer buffer;//初始化缓存区
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);//初始化写入器
doc.Accept(writer);//写入doc
FILE* file = fopen(writeAblePath.c_str(), "wb");
if (file) {
fputs(buffer.GetString(), file);
fclose(file);
}
本文详细介绍了Cocos2d-x中UserDefault的使用方法,包括存储和读取数据,并展示了如何在iOS开发中将文件拷贝到可读写路径下进行修改。同时,还介绍了如何使用rapidjson解析JSON文件,包括添加、修改和删除JSON对象的实例。
478

被折叠的 条评论
为什么被折叠?



