看了quick-cocos2d-x 的framework,发现里面有一个GameState,查了下,是数据存储的类,于是稍稍总结下我用到过的数据存储方式吧。

一共是三种方法:

  1. cc.UserDefault
  2. cc.utils.State
  3. io

优缺点:

  前两个使用起来更方便,因为是系统已经定义好的了。但缺点是不能在lua层面随便更改文件名和路径。

  所以在使用时,根据不同的需求,可选择第一或者第三,第二个不太建议使用,太麻烦了。

  普通的应用信息,比如各种开关,使用cc.UserDefault保存,可随应用的删除,自动删除文件。

  用户的账号信息,使用io存储,保存在sd卡中,这样用户在重装应用后,依然能顺利进入。

第一种是使用cc.UserDefault类。这是系统提供的,产生的文件名为 UserDefault.xml, 文件名在lua层面是无法修改的,如果想修改,需要修改C++代码。

两个方法,存 和 读取, 主要注意的是 不同的数据类型 调用的方法不同,如下面的例子

 local ParamType =
{
Integer = "int",
String = "string",
Float = "float",
Bool = "bool",
Double = "double",
} -- 保存
function NativeData:saveValeForKey(val, key, type)
if type == ParamType.String then
cc.UserDefault:getInstance():setStringForKey(key, val)
elseif type == ParamType.Integer then
cc.UserDefault:getInstance():setIntegerForKey(key, val)
elseif type == ParamType.Float then
cc.UserDefault:getInstance():setFloatForKey(key, val)
elseif type == ParamType.Double then
cc.UserDefault:getInstance():setDoubleForKey(key, val)
elseif type == ParamType.Bool then
cc.UserDefault:getInstance():setBoolForKey(key, val)
end
end -- 读取
function NativeData:getValeForKey( key, type, default)
local vale = nil
if type == ParamType.String then
vale = cc.UserDefault:getInstance():getStringForKey(key, default)
elseif type == ParamType.Integer then
vale = cc.UserDefault:getInstance():getIntegerForKey(key, default)
elseif type == ParamType.Float then
vale = cc.UserDefault:getInstance():getFloatForKey(key, default)
elseif type == ParamType.Double then
vale = cc.UserDefault:getInstance():getDoubleForKey(key, default)
elseif type == ParamType.Bool then
vale = cc.UserDefault:getInstance():getBoolForKey(key, default)
end return vale end

第二种是使用cc.utils.State类。文件位置在framework/cc/utils/GameState.lua。默认framework并没有加载,如果我们要用到,需要手动加载。一般在myApp开头加载。

require("framework.cc.utils.GameState")

加载完成后,需要初始化,cc.utils.State.init(eventListener_, stateFilename_, secretKey_)

在场景初始化之前调用一次即可,如在MyApp.lua的MyApp:ctor()中调用。

eventListener_是载入或保存时的回调函数

stateFilename_是保存的文件名,如果留空或非字符串(string)则是默认的state.txt,该文件会被保存到device.writablePath下

secretKey_是 校验文件时所用到的密钥,GameState保存的数据格式为{h = hash, s = s},s是我们要保存的数据(一个table),h则是要校验的一个md5码。如果secretKey_留空或为非字符串(string)则不加校验码, 直接保存数据,跟CCUserDefault一样了。

加载完成后,就是正常的使用。load 和save 方法都会 回调 init中的第一个参数。

 -- 这个方法一般只需调用一次,将本地文件load到内存中
function GameState.load()
end -- newValues是新的值,其实就是加载到内存中后保存的对象么。
function GameState.save(newValues)
end -- 返回完整路径
function GameState.getGameStatePath()
end

关于eventListener_,可以看一下 http://my.oschina.net/lonewolf/blog/173063 写的,很详细。

第三种是使用io 直接读写文件。这个最灵活。可以根据自己的需要设定存储目录,文件名,是否需要加密。需要注意读取之前需要判断是否存在目录 不存在则要创建。

一个简单的文件工具类

module("MakeFileUtils", package.seeall)

local lfs, os, io = require"lfs", os, io

function readFile(path)
local file = assert(io.open(path, "rb"))
if file then
local content = file:read("*all")
io.close(file)
return content
end
return nil
end function writeFile(filename, data, rt)
local f = assert(io.open(filename, rt))
f:write(data)
f:close()
end function checkDirOK( path )
local prepath = lfs.currentdir() if lfs.chdir(path) then
lfs.chdir(prepath)
return true
end if lfs.mkdir(path) then
return true
end
end

-- 读取

if not io.exists(fn) then
return
end local cnt = MakeFileUtils.readFile(fn) if cnt ~= nil and cnt ~= "" then
return json.decode(cnt)
end

-- 写入

MakeFileUtils.writeFile(fn, json.encode(cnt), "w+")

quick-cocos2d-x数据存储 UserDefault GameState io的更多相关文章

  1. LabVIEW(四):数据存储和文件IO

    1.使用NI数据采集板卡来进行数据保存和文件I/O操作.2.在一个典型的测试测量系统当中,包括:信号调理.信号采集.信号分析.信号显示.数据存储.数据存储:将采集到的数据储存到磁盘上,以备日后离线分析 ...

  2. 数据存储与IO(一)

    应用程序沙盒简介:iOS应用程序只能在系统为它分配的文件区域内读写文件,这个区域就是此应用程序的沙盒,Application目录下的GUID文件夹就是沙盒,这个文件夹是系统随机命名的.程序所有的非代码 ...

  3. android学习笔记45——android的数据存储和IO

    android的数据存储和IO SharedPreferences与Editor简介 SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此其保存的数据主要是简单的类型的ke ...

  4. Java基础知识强化之IO流笔记46:IO流练习之 把文本文件中数据存储到集合中的案例

    1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据 ...

  5. Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例

    1. 把集合中的数据存储到文本文件案例:    需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字 ...

  6. 【Android】数据存储-java IO流文件存储

    1.数据持久化:将在内存中的瞬时数据保存在存储设备中.瞬时数据:设备关机数据丢失.持久化技术提供一种机制可以让数据在瞬时状态和持久状态之间转换. 2.Android中简单的三种存储方式:文件存储.Sh ...

  7. Android数据存储之IO

    Android开发中免不了数据本地的存储,今天我们来说一说怎样利用IO流来进行数据存储. 这里我们通过模拟一个QQ登陆界面的小demo来实际操作IO流. 功能描写叙述:点击button能够保存用户输入 ...

  8. cocos2d-x lua table数据存储

    cocos2d-x lua table数据存储 version: cocos2d-x 3.6 1. 将table转为json http://blog.csdn.net/songcf_faith/art ...

  9. Android之文件数据存储

    一.文件保存数据介绍 Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的.文件可用来存放大量数据,如文本.图 ...

随机推荐

  1. MFC消息处理

    1.MFC窗口如何与AfxWndProc建立联系. 当一个新的CWnd派生类创建时,在调用CWnd::CreateEx()过程中,MFC都会安装AfxCbtFilterHook().这个Hook将拦截 ...

  2. 解决连接mysql报错1130

    最近在服务器上部署好的应用突然间连接不上mysql数据库,报错“ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this M ...

  3. centos7 nginx端口转发出现502的其中一种原因

    在排查了一系列可能的原因后仍无法解决,经资料查阅可能是SELinux造成,SELinux很强大但若配置不当也会造成很多组件无法正常使用,这里直接将其关闭: //打开配置文件 vi /etc/selin ...

  4. nginx 反向代理 ,入门

    入门:http://www.cnblogs.com/jjzd/p/6691500.html 启动,重新加载:http://blog.csdn.net/zhongguozhichuang/article ...

  5. placeholder 颜色

    /* placeholder颜色 */::-webkit-input-placeholder { /* WebKit browsers */color: #ccc;}:-moz-placeholder ...

  6. bzoj4278[ONTAK2015]Tasowanie & bzoj1692[USACO 2007Dec]队列变换(Best Cow Line) 贪心正确性证明

    做法网上到处都有就不说了. 这题其实是之前做的….不过由于人太傻现在才想明白比较字典序进行贪心的正确性…. 方便起见,在两个串的最右端都加上很大但不相同的字符,避免第lcp+1个字符不存在的边界. 如 ...

  7. BZOJ4247 挂饰(动态规划)

    相当于一个有负体积的背包.显然如果确定了选哪些,应该先把体积小的挂上去.于是按体积从小到大排序,就是一个裸的背包了. #include<iostream> #include<cstd ...

  8. 原生JS表单序列化

    // 表单序列化,IE9+ HTMLFormElement.prototype.serialize = function() { var form = this; // 表单数据 var arrFor ...

  9. CentOS 安装MariaDB

    1.安装 #同时安装mariadb和mariadb-server [root@bigdata-senior01 yum.repos.d]# yum -y install mariadb mariadb ...

  10. 【刷题】BZOJ 4698 Sdoi2008 Sandy的卡片

    Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第 ...