2011-10-30 7 views

ответ

69

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

Как я могу прочитать эту «HashMap» позже? – Roman

+5

С ObjectInputStream. –

+1

Этот ответ является самым полезным! – 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

, но мне нужно, чтобы сохранить хеш-карту, как он сам, как мы добавив вектор в общих настройках – jibysthomas

+0

чем вы должны, вероятно, использовать сериализацию и сохранить сериализованный HashMap в SharedPrefs. Вы можете легко найти примеры кода, как это сделать. – hovanessyan

41

Я использую 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(); 
} 
+3

Но как мы можем это сделать? Любой образец кода? –

+0

Как получить hashmap из gson i получил ошибку msg like com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: ожидается BEGIN_OBJECT, но BEGIN_ARRAY в строке 1 столбец 2 - – Ram

+0

@Ram Я добавил код. Возможно, это поможет – penduDev

31

Я написал простой кусок кода, чтобы сохранить карту в предпочтении и загрузить карту от предпочтений. Никаких функций 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; 
} 
2

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

Как отделившийся ответ 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; 
} 
0

Вы можете использовать это в выделенный на общих префов файл (источник: https://developer.android.com/reference/android/content/SharedPreferences.html):

GETALL

добавлены в уровне API 1 Карта GETALL() Получить все значения из в предпочтения.

Обратите внимание, что вы не должны изменять коллекцию, возвращенную этим методом, или изменять любое его содержимое. Согласованность сохраненных вами данных не гарантируется, если вы это сделаете.

Возвращает карту Возвращает карту, содержащую список пар ключ/значение, представляющее предпочтения.

Смежные вопросы