Сохранение хэш-карты в общих настройках

Как я могу сохранить хэш-карту в общих настройках в Android?

Я бы не рекомендовал писать сложные объекты в 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(); 

Я использую 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 как ключом и Boolean как значение.

 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; } 
 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(); 

В ответ на ответ Вино Джона Хосана я изменил ответ, чтобы использовать более общие вставки, основанные на ключе данных, вместо одного ключа, такого как "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; } 

Вместо этого вы можете попробовать использовать 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(); }