看了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. Swift-枚举enum理解

    //定义一个枚举 //枚举的语法,enum开头,每一行成员的定义使用case关键字开头,一行可以定义多个关键字 enum CompassPoint { case North case South ca ...

  2. linux的几个发行网站

     Red Hat: http://www.redhat.com  Fedora: http://fedoraproject.org/  Mandriva: http://www.mandriva ...

  3. getGeneratedKeys自动获取主键的方法

    public class Demo { public static void main(String[] args) { try { String sql="insert into pers ...

  4. linux下清空文件全部内容,如log日志

    在实际操作中经常需要清空log文件, 比如a.log,   有的人说, 直接删除不就行了, 但是, 直接删除后, 没法使用tail -f a.log了. 有的人说, 先rm再touch一个新文件不就可 ...

  5. c++ int 负数 补码 隐式类型转换

    unsigned y = ; ; cout << x + y << endl; 对于上述的结果为 这里面有一个负数的补码问题和不同类型之间的隐式类型转换问题 首先负数的表示方法 ...

  6. python json 序列化

    如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过 ...

  7. BZOJ3139/BZOJ1306 HNOI2013比赛/CQOI2009循环赛(搜索)

    搜索好难啊. 1.对于每个分数集合记忆化. 2.某人得分超过总分,剪枝. 3.某人之后全赢也无法达到总分,剪枝. 4.每有一场比赛分出胜负总分会多三分,而平局则会多两分.某人的分出胜负场次或平局场次超 ...

  8. Oracle数据库中心双活之道:ASM vs VPLEX

    Oracle数据库中心双活之道:ASM vs VPLEX 来源 https://www.cnblogs.com/wenjiewang/p/7460212.html 双活方案对比:ASM vs V-PL ...

  9. POJ3264:Balanced Lineup——题解+st表解释

    我早期在csdn的博客之一,正好复习st表就拿过来.http://write.blog.csdn.net/mdeditor#!postId=63713810 这道题其实本身不难(前提是你得掌握线段树或 ...

  10. BZOJ1509 NOI2003 逃学的小孩

    Description: Input: 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1 ...