Libgdx之数据保存 和 数据加密

Libgdx 中使用Preference以哈希表的形式进行数据的保存,在桌面版保存在目录”.prefs”下面,注意所有桌面的Preference都保存在.prefs目录下,所以文件名最好以”com.myname.game1.settings”而不是”Settings”

只有调用方法flush才会将数据从内存保存到磁盘上

Gdx.app.getPreferences(String filename)来创建Preference实例

public boolean contains (String key);

public void clear ();

public void remove (String key);

/* Makes sure the preferences are persisted. /

public void flush ();

这样保存数据是明文保存的,有时候我们需要加密数据,不想任何人都可以看到和修改,这时我们需要使用Base64Coder来进行加密。

现在我们先看Preferences进行数据保存的代码,之后再看加密的代码

Preferences保存数据

public class PreferenceTest extends ApplicationAdapter {
    Preferences pre;
    SpriteBatch sb;
    BitmapFont bf;

    @Override
    public void create() {
        pre = Gdx.app.getPreferences("PreferenceTest");

        pre.putBoolean("IsBool", true);
        pre.putInteger("IsInt", 2);
        pre.putString("IsString", "Libgdx");
        pre.flush();

        sb = new SpriteBatch();
        bf = new BitmapFont();
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0.39f, 0.58f, 0.92f, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        sb.begin();
        bf.draw(sb, "IsBoole=" + pre.getBoolean("IsBool") + "  IsInt=" + pre.getInteger("IsInt") + "  IsString=" + pre.getString("IsString"), 40, 40);
        sb.end();
    }

    @Override
    public void dispose() {
        sb.dispose();
        bf.dispose();
    }

}

使用Base64Coder加密操作的代码,示例比较简单,首先需要一个辅助类-DataSaveSecurity-来加密解密数据,

public class DataSaveSecurity {
    private Save save;
    private FileHandle file = Gdx.files.local("bin/scores.json");

    public DataSaveSecurity() {
        save = getSave();
    }

    private Save getSave() {
        Save save = new Save();

        if (file.exists()) {
            Json json = new Json();
            // 读取文件,并且解密
            save = json.fromJson(Save.class, Base64Coder.decodeString(file.readString()));
        }
        return save;
    }

    public void saveToJson() {
        Json json = new Json();
        json.setOutputType(OutputType.json);
        file.writeString(Base64Coder.encodeString(json.prettyPrint(save)), false);
    }

    public void saveDataValue(String key, Object object){
        save.data.put(key, object);
        saveToJson(); // 立即保存数据

    }

    public Integer loadDataValue(String key, Class<Integer> type){
        // 如果包含key的数据则返回数据,否则返回null
        if(save.data.containsKey(key))
            return (Integer) save.data.get(key);
        else
            return null;
    }
    /** 根据需要T替换要读取的类型
     * public <T> T loadDataValue(String key, Class type){
        if(save.data.containsKey(key))return (T) save.data.get(key);
        else return null;   //this if() avoids exception, but check for null on load.

    }
     */
    private static class Save {
        public ObjectMap<String, Object> data = new ObjectMap<String, Object>();
    }
}

之后是对数据的操作

public class DataSecurityTest extends ApplicationAdapter {

    SpriteBatch sb;
    BitmapFont bf;
    DataSaveSecurity dataSaveSecurity;

    @Override
    public void create() {
        sb = new SpriteBatch();
        bf = new BitmapFont();

        dataSaveSecurity = new DataSaveSecurity();
        for (int i = 0; i < 3; i++) {
            dataSaveSecurity.saveDataValue("data"+i, 100+i);
        }
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0.39f, 0.58f, 0.92f, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        sb.begin();
        bf.draw(sb, ""+dataSaveSecurity.loadDataValue("data0", Integer.class), 40, 40);
        bf.draw(sb, ""+dataSaveSecurity.loadDataValue("data1", Integer.class), 40, 80);
        bf.draw(sb, ""+dataSaveSecurity.loadDataValue("data2", Integer.class), 40, 120);
        sb.end();
    }

    @Override
    public void dispose() {
        sb.dispose();
        bf.dispose();
    }

}

时间: 2024-07-29 08:23:48

Libgdx之数据保存 和 数据加密的相关文章

ClientDataset+TDataSetProvider的数据保存问题

看到一篇介绍ClientDataSet和TDataSetProvider,非常精彩,特此保存. ================================================================================= 前台:D7或D2005; DBExpress连接组件:TSqlConnection,TSqlQuery ,TDataSetProvider,TClientDataSet;后台:SQL Server 2000; 更新数据的命令:DataSet

Delphi:ClientDataset+TDataSetProvider的数据保存问题

看到一篇介绍ClientDataSet和TDataSetProvider,非常精彩,特此保存. =========================================================================== TClientDataSet用法 第十一章 TClientDataSet 与TTable.TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端.TClientDataSet最大的特点是它不依赖于

安卓第二天笔记-数据保存

安卓第二天笔记--数据保存 1.保存数据私有文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&

Android 数据保存

Android数据保存方法 android数据保存主要保存以下三种: 1.共享参数文件中保存简单的键值对数据: 2.保存任意的文件数据到Android的文件系统中: 3.使用SQLite数据库管理 保存键值集 通过使用SharePreferences API来保存简单的键值对数据. 共享参数文件的获取或创建: 可以通过以下两种方法来获取: getSharedPreferences()  该方法需要提供一个共享参数文件的名称标识,该方法可以在任意Context中调用 getPreferences(

内存卡的数据保存与读取

,内存卡 2.1数据保存 File file=new File(Environment.getExternalStorageDirectory(), name); try { FileOutputStream   fos=new FileOutputStream(file); fos.write(content.getBytes()); fos.close(); Toast.makeText(getApplicationContext(), "保存成功", 200).show(); }

Android数据保存之文件保存

前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,而且是以key-value形式保存的String类的信息,比較有局限性. 比方你须要保存从网络获取的图片到本地作为缓存数据,而且数量比較大.SharedPreferences就不能满足你的需求了,这个时候就要用到基本上全部平台都会用到的文件保存. Android中以文件形式把数据保存到磁盘上与其它平台基本上都

Hibernate数据保存操作方法的原理对比

Interface Session All Superinterfaces: Serializable All Known Subinterfaces: EventSource, Session All Known Implementing Classes: SessionImpl public interface Session  extends Serializable Java应用程序与Hibernate之间的主要运行时接口.它是抽象了持久化服务概念的核心抽象API类. Session的生

ios开发——实用技术篇&amp;数据保存于恢复

数据保存于恢复 用户操作(输入数据)之后,应用程序退出并且终止之后,当用户再次打开应用的时候还是保持原来的状态 一:在storyBoard中设置恢复标志符 二:在AppDalegate中代理方法 1 -(BOOL) application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder 2 { 3 return YES; 4 } 5 6 -(BOOL) application:(UIApplicat

基于GDAL的线数据保存

保存数据的第一步是要把数据解析出来,然后根据GDAL的规则进行数据point类型的shapefile数据生成.大概步骤为: 一.定义保存点要素数据的类 这里定义了两个基类: //基类,保存要素类型,点.线.面 class Element { private: char Type; int Code; public: Element(void); ~Element(void); void setType(char Type); char getType(); void setCode(int Co