2011-10-30 25 views

Respuesta

69

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(); 
+2

¿Cómo puedo leer este 'HashMap' más tarde? – Roman

+5

Con un ObjectInputStream. –

+1

¡Esta respuesta es la más útil! – mxg

29
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(); 
+0

pero necesito guardar el mapa hash como la misma como si la adición de vector en las preferencias compartidas – jibysthomas

+0

que usted tiene que utilizar probablemente serialización y guardar el HashMap serializado en SharedPrefs. Puede encontrar fácilmente ejemplos de código sobre cómo hacer eso. – hovanessyan

41

utilizo para convertir GsonHashMap a String y luego guardarlo en 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(); 
} 
+3

Pero, ¿cómo podemos hacer eso? ¿Alguna muestra de código? –

+0

cómo obtener hashmap de gson recibí el mensaje de error como com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT esperado, pero era BEGIN_ARRAY en la línea 1 columna 2 - – Ram

+0

@Ram He agregado el código. Tal vez ayude – penduDev

31

He escrito un simple trozo de código para guardar un mapa de 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<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; 
} 
2

Podría intentar usar JSON en su lugar.

Para ahorrar

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 
} 

Para conseguir

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

Como un spin off de la respuesta de Vinoj John Hosan, modifiqué la respuesta para permitir inserciones más genéricos, basada en la clave de los datos , en lugar de una sola clave como "My_map".

En mi aplicación, MyApp es mi clase Application anulación, y MyApp.getInstance() actúa para devolver el 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; 
} 
0

Se puede usar esta en un dedicado en Preferencias compartidos presentar (fuente: https://developer.android.com/reference/android/content/SharedPreferences.html):

getAll

añadido en el nivel API 1 Mapa getAll() Recuperar todos los valores de la 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 es no garantizada si lo hace.

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

Cuestiones relacionadas