quick-cocos2d-x数据存储 UserDefault GameState io

看了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++代码。

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

 1 local ParamType =
 2 {
 3     Integer = "int",
 4     String = "string",
 5     Float = "float",
 6     Bool = "bool",
 7     Double = "double",
 8 }
 9
10 -- 保存
11 function NativeData:saveValeForKey(val, key, type)
12     if type == ParamType.String then
13         cc.UserDefault:getInstance():setStringForKey(key, val)
14     elseif type == ParamType.Integer then
15         cc.UserDefault:getInstance():setIntegerForKey(key, val)
16     elseif type == ParamType.Float then
17         cc.UserDefault:getInstance():setFloatForKey(key, val)
18     elseif type == ParamType.Double then
19         cc.UserDefault:getInstance():setDoubleForKey(key, val)
20     elseif type == ParamType.Bool then
21         cc.UserDefault:getInstance():setBoolForKey(key, val)
22     end
23 end
24
25 -- 读取
26 function NativeData:getValeForKey( key, type, default)
27     local vale = nil
28     if type == ParamType.String then
29         vale = cc.UserDefault:getInstance():getStringForKey(key, default)
30     elseif type == ParamType.Integer then
31         vale = cc.UserDefault:getInstance():getIntegerForKey(key, default)
32     elseif type == ParamType.Float then
33         vale = cc.UserDefault:getInstance():getFloatForKey(key, default)
34     elseif type == ParamType.Double then
35         vale = cc.UserDefault:getInstance():getDoubleForKey(key, default)
36     elseif type == ParamType.Bool then
37         vale = cc.UserDefault:getInstance():getBoolForKey(key, default)
38     end
39
40     return vale
41
42 end

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

1 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中的第一个参数。

 1 -- 这个方法一般只需调用一次,将本地文件load到内存中
 2 function GameState.load()
 3 end
 4
 5 -- newValues是新的值,其实就是加载到内存中后保存的对象么。
 6 function GameState.save(newValues)
 7 end
 8
 9 -- 返回完整路径
10 function GameState.getGameStatePath()
11 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

-- 写入

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

时间: 2024-09-30 07:15:08

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

cocos2d-x 之 简单数据存储——Userdefault

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 好久没有更新cocos2d-x的东西了,是在太忙,木有时间啊= =.. 1.基本概念 本篇文章是介绍,简单数据存储的Userdefault类,在API中: 就是存储一些简单的数据,比如声音的开启关闭,音效的开启关闭,最高分,金币数量的存储这些东西. 2.获取 这

quick-cocos2d-x数据存储之GameState

因为GameState并没有在framework中加载,所以我们要在开始的代码中去加载,如在MyApp.lua的开头位置加载 GameState=require(cc.PACKAGE_NAME .. ".api.GameState") local GameState = {} GameState.ERROR_INVALID_FILE_CONTENTS = -1 GameState.ERROR_HASH_MISS_MATCH = -2 GameState.ERROR_STATE_FILE

cocos2d-x中的简单的数据存储

Cocos2d-x中的数据存储方式很多,下面我来简单的介绍几种,有说的不准确的地方,大家指出来吧,共同学习进步.谢谢! 首先介绍的是  UserDefault 这个类: //用userdefault进行数据存储 UserDefault::getInstance()->setStringForKey("testKey","testValue");//将String类型的数据存储起来 //读取上面写入的数据 std::string val = UserDefaul

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

1.数据持久化:将在内存中的瞬时数据保存在存储设备中.瞬时数据:设备关机数据丢失.持久化技术提供一种机制可以让数据在瞬时状态和持久状态之间转换. 2.Android中简单的三种存储方式:文件存储.SharedPreference 存储以及数据库存储. 1.文件存储 :不对数据作任何处理,将数据原封不动地存储到文件中,适合存储一些简单的文本数据和二进制数据. a.将数据存储到文件中 Context类提供了一个openFileOutput()方法,可以用于将数据存储到文件中.这个方法接收两个参数,第

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

1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据源是一个文本文件.      目的地是一个集合.      而且元素是字符串.      数据源:   b.txt -- FileReader -- BufferedReader  目的地:  ArrayList<String> 2. 代码示例: 1 package cn.itcast_02; 2

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

1. 把集合中的数据存储到文本文件案例:    需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字符串.遍历ArrayList集合,把数据获取到.然后存储到文本文件中.文本文件说明使用字符流. (2) 数据源: ArrayList<String> -- 遍历得到每一个字符串数据 目的地: a.txt -- FileWriter -- BufferedWriter 2. 代码示例: 1 pack

Cocos2d-x数据篇01:UserDefault数据存储

尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2418 [前言] 一个游戏怎么能没有游戏存档呢?在Cocos2d-x中也提供了一个数据存储类CCUserDefault,可以作为一个轻量级的数据库来使用.它支持五种数据bool.int.float.double.string的存储. [Demo下载] UserDefault数据存储 [Cocos2d-x 3.x] (1)去掉 “CC” (2)获取单例:sharedUserDefault() 改为 get

Android数据存储之IO

Android开发中免不了数据本地的存储,今天我们来说一说如何利用IO流来进行数据存储. 这里我们通过模拟一个QQ登陆界面的小demo来实际操作IO流. 功能描述:点击按钮能够保存用户输入的用户名和密码,当点击记住密码时,亦能在应用第二次打开时,回显用户名和密码 1.这里布局文件的代码就不贴了,看效果图 2.MainActivity.java package com.example.viewswitchtest; import java.io.BufferedReader; import jav

第三章:iOS的数据存储与IO

如果应用程序值需要保存程序参数.选项相关的少量数据,则可使用NSUserDefaults进行保存; 如果应用程序只是少量数据需要保存,那使用属性列表文件就可以了; 如果应用程序有大量数据需要存储.访问,就需要借助于数据库.iOS系统内置了SQLite数据库,SQLite数据库是一个真正轻量级的数据库,他没有后台进程,整个数据库就对应于一个文件,这样就可以非常方便的在不同设备之间移植.iOS为访问SQLite数据库提供了两套API:基于C语言风格的libsqlite3.dylib和面向对象的Cor