关于Userdefault数据存储的介绍网上有很多,下面贴一个我觉得比较好的,还有自己在项目中的实际应用:
CCUserDefault采用XML存储技术,就是一般的键值对,这个类似C++中的map的映射(键——值)。一个关键字对应一个值。其实现的接口也比较简单实用,通过传统的set()、get()方法访问和修改值。
它支持五种数据:bool、int、float、double、string。
1、原理
(1)类似map的映射(键——值)。一个关键字对应一个值,并利用set()/get()进行访问。
(2)数据直接存储在一个XML文件中,并且文件名为程序项目的名字,如“MyTest.xml”。
(3)首次使用时,XML不存在,CCUserDefault会自动创建相应的XML文件。
2、设置数据值set
通过(键——值)的方式进行设置。
void setBoolForKey( constchar* pKey, bool value); //设置一个bool值
void setIntegerForKey(constchar* pKey, int value); //设置一个int值
void setFloatForKey( constchar* pKey, float value); //设置一个float值
void setDoubleForKey( constchar* pKey, double value); //设置一个double值
void setStringForKey( constchar* pKey, conststd::string& value); //设置一个string值
3、获取数据值get
通过关键字,来从XML文件中获取数据值。
若关键字不存在,会自动设置(键——值)映射,并设置对应的默认值defaultValue。
bool getBoolForKey( constchar* pKey, bool defaultValue = false); //读取一个bool值
int getIntegerForKey(constchar* pKey, int defaultValue = 0); //读取一个int值
float getFloatForKey( constchar* pKey, float defaultValue = 0.0); //读取一个float值
double getDoubleForKey( constchar* pKey, double defaultValue = 0.0); //读取一个double值
std::string getStringForKey( constchar* pKey, conststd::string& defaultValue = ""); //读取一个string值
4、保存flush
当set完后,数据不会马上保存到XML文件中。
所以一定要记得用flush()来保存数据,否则会丢失!
CCUserdefault::sharedUserdefault()->flush();
贴一个实例代码作为例子,int bool类型的数据存储,其他的同理。
实例代码:DataManager.h
#ifndef __Data_Manager__
#define __Data_Manager__
#include<iostream>
#include "cocos2d.h"
#define RSet DataManager::setData
#define RGet DataManager::getData
#define RFlush DataManager::flush(true)
#define MC_USER CCUserDefault::sharedUserDefault()
using namespace cocos2d;
class DataManager
{
public:
static DataManager * getInstance();
/** 储存数据 **/
static void setData(std::string key, const char* data);
static void setData(std::string key, int data);
static void setData(std::string key, float data);
static void setData(std::string key, bool data);
static std::string getData(std::string key, const char *data);
static int getData(std::string key, int data);
static float getData(std::string key, float data);
static bool getData(std::string key, bool data);
/** 确认储存 **/
static void flush(bool pBool = false);
/*
设置音效状态
*/
static void savePlayMusic(bool IsPause);
/*
获取音效状态
*/
static bool readPlayMusic();
/**
* 取得金币数,获取的来源:每日签到、商店
*/
static int getGoldNum();
/**
* 设置金币数,获取的来源:每日签到、商店
*/
static void setGoldNum(int m_GoldNum);
};
#endif
注意:cocos3.10以上版本Userdefault没有sharedpreference(),所以需要改成
#define MC_USER UserDefault::getInstance()
DataManager.cpp
#include"DataManager.h"
static DataManager * _instance = NULL;
DataManager * DataManager::getInstance()
{
if(!_instance)
{
_instance = new DataManager();
}
return _instance;
}
/**写入数据**/
void DataManager::setData(std::string key, const char*data){
MC_USER->setStringForKey(key.c_str(), data);
}
void DataManager::setData(std::string key, int data){
MC_USER->setIntegerForKey(key.c_str(), data);
}
void DataManager::setData(std::string key, float data){
MC_USER->setFloatForKey(key.c_str(), data);
}
void DataManager::setData(std::string key, bool data){
MC_USER->setBoolForKey(key.c_str(), data);
}
/**读取数据**/
std::string DataManager::getData(std::string key, const char*data){
return MC_USER->getStringForKey(key.c_str(), data);
}
int DataManager::getData(std::string key ,int data){
return MC_USER->getIntegerForKey(key.c_str(), data);
}
float DataManager::getData(std::string key, float data){
return MC_USER->getFloatForKey(key.c_str(), data);
}
bool DataManager::getData(std::string key, bool data){
return MC_USER->getBoolForKey(key.c_str(), data);
}
/**确认存储**/
void DataManager::flush(bool pBool){
MC_USER->flush();
}
//保存音效状态
void DataManager::savePlayMusic(bool IsPause){
RSet("isMusicPause", IsPause);
RFlush;
}
//获取音效状态
bool DataManager::readPlayMusic(){
return RGet("isMusicPause", false);
}
//获取金币数量
int DataManager::getGoldNum(){
return RGet("_GlodNum", 0);
}
//设置金币数量
void DataManager::setGoldNum(int m_GoldNum){
RSet("_GlodNum", m_GoldNum);
RFlush;
}