java - LibGdx 使用 ArrayList 进行数据持久化

标签 java android libgdx

我对 LibGdx 和 Android 编程还是新手..

我正在尝试创建一个类,用于在我的应用程序中存储数据 类看起来像这样

package com.mygdx.hanoi.util;

import java.util.Map;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Preferences;

public class DataPersister2 {

    public Preferences getOrCreatePreferences(String prefName){
        return Gdx.app.getPreferences(prefName + ".prefs");
    }
    public Map getPreferencesData(Preferences prefName){
        return (Map) prefName.get(); //.get(key);
    }
    public void clearPreferences(Preferences prefName){
        prefName.clear();
    }
    public void insertPreferences(Preferences prefName, Map data){
        prefName.put(data);
        prefName.flush();
    }
}

问题是,当我尝试使用该类创建首选项并向其中添加 ArrayList 时,它总是说首选项为 null

DataPersister2 hs = new DataPersister2();
        Preferences hScore = hs.getOrCreatePreferences("highScores");
        hs.clearPreferences(hScore);

        // dummy test score data
        ArrayList<String[]> hsFreeMode = new ArrayList<String[]>();  // declare apa yang mau ditaruh sini, biar ga error di kemudian method
        hsFreeMode.add(new String[] {"luki", "5000"});
        hsFreeMode.add(new String[] {"laras", "3900"});

        ArrayList hsMoveMode = new ArrayList();
        hsMoveMode.add(new String[] {"cika", "6000"});
        hsMoveMode.add(new String[] {"cikoo", "1000"});

        Map hsMap = new HashMap();
        hsMap.put("freeMode", hsFreeMode);
        hsMap.put("moveMode", hsMoveMode);

        //hs.insertPreferences("highScores", hsMap);
        hs.insertPreferences(hScore, hsMap);

        // print out the data
        Map data = hs.getPreferencesData(hScore);
        Gdx.app.log("data print", "the free mode value is " + (String[]) data.get("freeMode"));
        Gdx.app.log("Array List", "the arraylist contains" + hsFreeMode.get(0)[0]);

每当我尝试从该类记录(在“数据打印”日志中)时,它总是显示 null 但是如果我直接从 ArrayList(在“Array List”日志中)记录它,该值就会出现..

对我来说更奇怪的是,如果我在将 map 值添加到首选项之前更改 map 值,如下所示:

Map hsMap = new HashMap();
    hsMap.put("freeMode", "luki");
    hsMap.put("moveMode", "laras");

    //hs.insertPreferences("highScores", hsMap);
    hs.insertPreferences(hScore, hsMap);

并像这样记录数据:

Gdx.app.log("data print", "the free mode value is " + data.get("freeMode"));

显示的数据... 所以我现在很困惑,还无法弄清楚我的问题出在哪里..

任何帮助将不胜感激:)

最佳答案

由于 libgdx 文档 Preferences仅支持字符串基本类型,因此您不能仅将数组放入首选项中。您需要在放置之前对其进行序列化,并在获取数据后对其进行反序列化,例如 JSON

    //adding to the preferences:

    hsMap.put("freeMode", json.toJson( hsFreeMode ) );


    //and then:

    Gdx.app.log("data print", "the free mode value is " + ( (String[])json.fromJson(ArrayList.class, String[].class, (String)data.get("freeMode") ).get(0) )[0] );

关于java - LibGdx 使用 ArrayList 进行数据持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32937019/

相关文章:

java - 是否可以通过 ConditionalPermissionAdmin 阻止对 System.exit 的调用?

java - 软键盘上的 Enter 键按下时不会触发事件

java - 无法使用 FlowTextView 设置文本大小

java - 如何确保指定声音只有 1 个实例在循环,以及如何阻止它循环?

java - 选择框 API 已更改

java - 逻辑帮助 - 按升序查找一系列元素

java - Spring 启动 : Is there a similar way to hold an XML resource of strings and reference them like in Androids framework?

android - 带有顶栏、底栏和剩余空间内容 View 的布局

android - fragment View 的显示 Action

java - android Java libgdx 文本文件