显示hashmap的麻烦

时间:2017-08-08 17:18:39

标签: java android hashmap

我的应用程序:有两个活动,一个用于创建两个字符串(名称和消息),这两个字符串保存到散列图中,传输到JSON并保存在SharedPreference中。 另一个活动获取此SharedPreference,再次将其传输到hashmap。然后由迭代器“读出”地图。

应该是:我的想法是,如果我多次执行此过程,迭代器会“读出”散列映射的所有条目。

问题:但是,只显示最后一个输入。

问题:为什么只显示最后一个输入?我是否重写了hashmap或其中的部分内容?如果是这样,我该如何避免呢?或者我还做错了什么?

活动1:

LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
    map.put(message, name);

    Gson gson = new Gson();
    String hashMapString = gson.toJson(map);

    SharedPreferences prefs = getSharedPreferences("SP", MODE_PRIVATE);
    prefs.edit().putString("hashString", hashMapString).apply();

活动2:

Gson gson = new Gson();
        SharedPreferences prefs = getSharedPreferences("SP", MODE_PRIVATE);

        String storedHashMapString = prefs.getString("hashString", "Error");
        java.lang.reflect.Type type = new TypeToken<LinkedHashMap<String, String>>(){}.getType();
        LinkedHashMap<String, String> map = gson.fromJson(storedHashMapString, type);


    Iterator myIterator = map.keySet().iterator();
    while(myIterator.hasNext()) {
        String key=(String)myIterator.next();
        String value=(String)map.get(key);
        Toast.makeText(getApplicationContext(), "Key: "+key+" Value: "+value, Toast.LENGTH_LONG).show();
    }

2 个答案:

答案 0 :(得分:2)

这样做

prefs.edit().putString("hashString", hashMapString).apply();

您只是保存新创建的hashmap的值,但是之前使用hashString键保存的旧丢失值

解决方案:获取旧值并将其与新值一起保存

选项一:获取上一个字符串,将其转换为jsonobject,然后将值添加到map

参考:creating Hashmap from a JSON String

选项二:如果您只有字符串键值对,那么

  • 从新地图字符串和旧地图字符串中删除{},然后只需合并它们并添加{}边界符号

     String allValues ="{"+((prefs.getString("hashString", "")+hashMapString)
                                      .replace("{","").replace("}",""))+"}";
    

然后保存它

prefs.edit().putString("hashString", allValues).apply();

答案 1 :(得分:0)

您正在查看最后一个输入,因为putString会覆盖第一个位置的内容

https://developer.android.com/reference/android/content/SharedPreferences.Editor.html