看了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. Java异常(Exception)

    Java异常:运行期出现的错误 1. Java异常是Java提供的用于处理程序中错误的一种机制: 2. 错误指的是程序运行期间发生的异常事件,如除零溢出.数组下标越界.读取的文件不存在.... 3. ...

  2. 《剑指offer》---顺时针打印矩阵

    本文算法使用python3实现 1. 问题1 1.1 题目描述:   输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 ...

  3. 基于gulp的前端自动化开发构建

    就前端的发展而言会越来越朝着后端的标准化靠近,后端的工程化以及模块化都很成熟.基于这样一个思路,开始探索如何优化目前的开发流程.而使用的工具就是gulp. 个人觉得gulp比较webpack更为简单实 ...

  4. 使用LoadRunner脚本采集Linux性能数据

    前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”.下面的脚本,是在LoadRunner里连接Linux/Unix远程服务器,收集其磁盘IO的负载到测试结果. 涉及到三个知 ...

  5. intellij idea 之 CheckStyle 代码格式校验

  6. Python使用ElementTree美化XML格式

    Python中使用ElementTree可以很方便的处理XML,但是产生的XML文件内容会合并在一行,难以看清楚. 如下格式: <root><aa>aatext<cc&g ...

  7. jdbc关闭连接顺序

    jdbc连接数据库时,先获取connection,再通过statement进行操作,将结果集放在resultset中,不过在关闭数据库的时候要小心,要跟前面的操作反着来,不然就会出现异常.如果直接关闭 ...

  8. c++源文件到可执行文件的过程

    1.预处理(preprocessor):对#pragma.#include.#define.#ifdef/#endif.#ifndef/#endif,inline内联函数等进行处理 2.编译(comp ...

  9. input 输入框不能点 readonly , disabled

    只读 readonly="readonly" 不可用 disabled="disabled" 背景变 灰色

  10. zoj3209-Treasure Map

    给出一个左下角为\((0,0)\),右上角为\((n,m)\)的矩形,再给出\(k\)个在大矩形内的小矩形(可以重合),问是否能用这些小矩形完全覆盖这个大矩形,并且没有重合,如果可以至少需要多少个. ...