我的应用程序:有两个活动,一个用于创建两个字符串(名称和消息),这两个字符串保存到散列图中,传输到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();
}
答案 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