¿Cómo guardar HashMap en Preferencias Compartidas?

¿Cómo puedo guardar un HashMap en Preferencias compartidas en Android?

No recomendaría escribir objetos complejos en SharedPreference. En cambio, usaría ObjectOutputStream para escribirlo en la memoria interna.

 File file = new File(getDir("data", MODE_PRIVATE), "map"); ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file)); outputStream.writeObject(map); outputStream.flush(); outputStream.close(); 

Yo uso Gson para convertir HashMap a String y luego guardarlo en SharedPrefs

 private void hashmaptest() { //create test hashmap HashMap testHashMap = new HashMap(); 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>(){}.getType(); HashMap testHashMap2 = gson.fromJson(storedHashMapString, type); //use values String toastString = testHashMap2.get("key1") + " | " + testHashMap2.get("key2"); Toast.makeText(this, toastString, Toast.LENGTH_LONG).show(); } 

Escribí un código simple para guardar el mapa con preferencia y cargar el mapa de preferencia. No se requieren funciones GSON o Jackson. Acabo de usar un mapa que tiene String como clave y Boolean como valor.

 private void saveMap(Map 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 loadMap(){ Map outputMap = new HashMap(); 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 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 aMap = new HashMap(); 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(); 

Como resultado de la respuesta de Vinoj John Hosan, modifiqué la respuesta para permitir inserciones más genéricas, basadas en la clave de los datos, en lugar de una sola clave como "My_map" .

En mi implementación, MyApp es mi clase de anulación de Application , y MyApp.getInstance() actúa para devolver el context .

 public static final String USERDATA = "MyVariables"; private static void saveMap(String key, Map 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 loadMap(String key){ Map outputMap = new HashMap(); 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 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; } 

Podría intentar usar JSON en su lugar.

Para guardar

 try { HashMap 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 } 

Para obtener

 try { String data = getSharedPreferences(INSERT_YOUR_PREF).getString("savedData"); HashMap 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(); } 

Puede utilizar esto en un archivo de preferencias dedicado en prefs (fuente: https://developer.android.com/reference/android/content/SharedPreferences.html ):

obtener toda

agregado en API nivel 1 Map getAll () Recupera todos los valores de las preferencias.

Tenga en cuenta que no debe modificar la colección devuelta por este método ni alterar ninguno de sus contenidos. La consistencia de sus datos almacenados no está garantizada si lo hace.

Mapa de devoluciones Devuelve un mapa que contiene una lista de pares clave / valor que representa las preferencias.