看了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. 3DMAX2016安装教程【图文】

    下载安装包之后,双击setup.exe. 下面是安装图片教程: 点击安装 点击下一步. 如图输入序列号和产品密钥. 填写安装路径,然后下一步. 开始安装,等待. 安装成功.

  2. IIS10和Tomcat8整合

    在网上找了很久,也试了很多,都没有弄好.后来根据这个博客,做一些小修小改,终于成功了. 我是从里面的IIS与TOMCAT整合那里开始看的.第一步上面要创建一个注册表,我没有创建.我是创建了一个名为&q ...

  3. Qt应用程序图标

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt应用程序图标     本文地址:http://techieliang.com/2017/1 ...

  4. jconsole工具监控java运行情况

    jconsole是jdk自带的工具.所以要先安装jdk  1.jconsole工具的路径: 通过which jconsole来查看 /usr/local/jdk1.7.0_79/bin/jconsol ...

  5. Perfmon - 脚本自动监控

    PerfMon-Windows性能监视器是个好东西,可以辅助我们分析发生问题时间段服务器资源占用情况,但是部署性能计数器确实一个相当麻烦的事情,往往这种枯燥的事别人还做不了,只能由我们这些希望获取到P ...

  6. C#添加本地打印机

    class Program { static void Main(string[] args) { const string printerName = "Print to file&quo ...

  7. CentOS 文本操作命令

    1.cat 用于查看纯文本文件,显示行号,加-n参数,适合内容较少的情况 2.more 用于查看纯文本文件,适合内容较多的情况 3.less 用于查看纯文本文件,可以上下翻页 4.head 用于查看纯 ...

  8. [CQOI2009]跳舞 网络流

    题面:[CQOI2009]跳舞 题解: 首先最大时间不好求,而且数据范围很小,所以我们可以先二分一个最大时间,然后就只需要判断是否可行即可. 因此我们每二分一个mid,对于每个女生,连s ---> ...

  9. Android 使用LocationManger进行定位

    在Android应用中,往往有获取当前地理位置的需求,比如微信获取附近的人需要获取用户当前的位置,不多说,直接上例子. public Location getLocation() { Location ...

  10. BZOJ3172 [Tjoi2013]单词 【AC自动机】

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4293  Solved: 2083 [Submit][Stat ...