如何在Android中保存HashMap至共享首选项?如何将HashMap保存到共享首选项?
回答
我不会推荐将复杂对象写入SharedPreference。相反,我会使用ObjectOutputStream
将其写入内部存储器。
File file = new File(getDir("data", MODE_PRIVATE), "map");
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(map);
outputStream.flush();
outputStream.close();
Map<String, String> aMap = new HashMap<String, String>();
aMap.put("key1", "val1");
aMap.put("key2", "val2");
aMap.put("Key3", "val3");
SharedPreferences keyValues = getContext().getSharedPreferences("Your_Shared_Prefs"), Context.MODE_PRIVATE);
SharedPreferences.Editor keyValuesEditor = keyValues.edit();
for (String s : aMap.keySet()) {
keyValuesEditor.putString(s, aMap.get(s));
}
keyValuesEditor.commit();
但我需要的哈希地图保存为本身就像我们添加矢量到共享偏好 – jibysthomas
比你有可能使用序列化和保存在SharedPrefs中序列化HashMap。您可以轻松找到有关如何执行此操作的代码示例。 – hovanessyan
我使用Gson
到HashMap
转换为String
然后将其保存到SharedPrefs
private void hashmaptest()
{
//create test hashmap
HashMap<String, String> testHashMap = new HashMap<String, String>();
testHashMap.put("key1", "value1");
testHashMap.put("key2", "value2");
//convert to string using gson
Gson gson = new Gson();
String hashMapString = gson.toJson(testHashMap);
//save in shared prefs
SharedPreferences prefs = getSharedPreferences("test", MODE_PRIVATE);
prefs.edit().putString("hashString", hashMapString).apply();
//get from shared prefs
String storedHashMapString = prefs.getString("hashString", "oopsDintWork");
java.lang.reflect.Type type = new TypeToken<HashMap<String, String>>(){}.getType();
HashMap<String, String> testHashMap2 = gson.fromJson(storedHashMapString, type);
//use values
String toastString = testHashMap2.get("key1") + " | " + testHashMap2.get("key2");
Toast.makeText(this, toastString, Toast.LENGTH_LONG).show();
}
我已经写了一段简单的代码来保存地图优先并加载从偏好地图。不需要GSON或Jackson功能。我刚刚使用了一个具有String作为键和布尔值作为值的映射。
private void saveMap(Map<String,Boolean> inputMap){
SharedPreferences pSharedPref = getApplicationContext().getSharedPreferences("MyVariables", Context.MODE_PRIVATE);
if (pSharedPref != null){
JSONObject jsonObject = new JSONObject(inputMap);
String jsonString = jsonObject.toString();
Editor editor = pSharedPref.edit();
editor.remove("My_map").commit();
editor.putString("My_map", jsonString);
editor.commit();
}
}
private Map<String,Boolean> loadMap(){
Map<String,Boolean> outputMap = new HashMap<String,Boolean>();
SharedPreferences pSharedPref = getApplicationContext().getSharedPreferences("MyVariables", Context.MODE_PRIVATE);
try{
if (pSharedPref != null){
String jsonString = pSharedPref.getString("My_map", (new JSONObject()).toString());
JSONObject jsonObject = new JSONObject(jsonString);
Iterator<String> keysItr = jsonObject.keys();
while(keysItr.hasNext()) {
String key = keysItr.next();
Boolean value = (Boolean) jsonObject.get(key);
outputMap.put(key, value);
}
}
}catch(Exception e){
e.printStackTrace();
}
return outputMap;
}
您可以尝试使用JSON代替。
为了节省
try {
HashMap<Integer, String> hash = new HashMap<>();
JSONArray arr = new JSONArray();
for(Integer index : hash.keySet()) {
JSONObject json = new JSONObject();
json.put("id", index);
json.put("name", hash.get(index));
arr.put(json);
}
getSharedPreferences(INSERT_YOUR_PREF).edit().putString("savedData", arr.toString()).apply();
} catch (JSONException exception) {
// Do something with exception
}
为了得到
try {
String data = getSharedPreferences(INSERT_YOUR_PREF).getString("savedData");
HashMap<Integer, String> hash = new HashMap<>();
JSONArray arr = new JSONArray(data);
for(int i = 0; i < arr.length(); i++) {
JSONObject json = arr.getJSONObject(i);
hash.put(json.getInt("id"), json.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
}
作为分拆Vinoj约翰Hosan的回答,我修改了答案,以允许更多的通用插入,基于数据的关键,而不是像"My_map"
这样的单个关键字。
在我的实施中,MyApp
是我的Application
覆盖类,而MyApp.getInstance()
的行为是返回context
。
public static final String USERDATA = "MyVariables";
private static void saveMap(String key, Map<String,String> inputMap){
SharedPreferences pSharedPref = MyApp.getInstance().getSharedPreferences(USERDATA, Context.MODE_PRIVATE);
if (pSharedPref != null){
JSONObject jsonObject = new JSONObject(inputMap);
String jsonString = jsonObject.toString();
SharedPreferences.Editor editor = pSharedPref.edit();
editor.remove(key).commit();
editor.putString(key, jsonString);
editor.commit();
}
}
private static Map<String,String> loadMap(String key){
Map<String,String> outputMap = new HashMap<String,String>();
SharedPreferences pSharedPref = MyApp.getInstance().getSharedPreferences(USERDATA, Context.MODE_PRIVATE);
try{
if (pSharedPref != null){
String jsonString = pSharedPref.getString(key, (new JSONObject()).toString());
JSONObject jsonObject = new JSONObject(jsonString);
Iterator<String> keysItr = jsonObject.keys();
while(keysItr.hasNext()) {
String k = keysItr.next();
String v = (String) jsonObject.get(k);
outputMap.put(k,v);
}
}
}catch(Exception e){
e.printStackTrace();
}
return outputMap;
}
可以在专用的使用共享Prefs文件(来源:https://developer.android.com/reference/android/content/SharedPreferences.html):
GETALL
在API级别1地图GETALL加入()从 所述检索的所有值优先。
请注意,您不得修改此方法返回的集合, 或更改其任何内容。您保存的数据的一致性是 ,如果您这样做,则无法保证。
返回地图返回包含表对偏好的键/值的列表 的地图。
- 1. 如何将字符串集保存到共享首选项
- 2. 如何将Firebase DataSnapshot对象保存到共享首选项?
- 3. 将项目保存到共享首选项后,listview laggy滚动
- 4. 将单选按钮值“int”保存到共享首选项
- 5. 保存int的共享首选项?
- 6. 共享首选项保存Textview背景
- 7. 保存意向共享首选项
- 8. 如何将共享首选项中的textView保存?
- 9. 如何将Spinner保存为共享首选项?
- 10. 共享首选项存储
- 11. 将日期保存到共享首选项
- 12. 将值保存到共享首选项的关键字段
- 13. 如何将json对象存储到共享首选项?
- 14. 如何使用共享首选项将多个图像保存到ImageView
- 15. 共享首选项
- 16. 共享首选项
- 17. 共享首选项
- 18. 如何在共享首选项中保存json响应的值?
- 19. 如何使用共享首选项来保存名称
- 20. 如何使用共享首选项编辑器保存
- 21. 如何使用共享首选项保存位置Android?
- 22. 如何使用共享首选项保存警告对话框
- 23. 如何在共享首选项中保存缩放位图?
- 24. 如何在共享首选项中保存图像?
- 25. 如何在iOS中的共享首选项中保存cookie?
- 26. 如何保存共享首选项值甚至设备关闭?
- 27. 无法将选定的单选按钮保存到共享首选项
- 28. 保存选项菜单共享首选项
- 29. 将自定义数组保存在共享首选项中
- 30. 将复杂结构保存为共享首选项
试试这个http://stackoverflow.com/a/39435730/6561141 – tpk