Как я могу сохранить HashMap в общих настройках в Android?
android
sharedpreferences
джибистомы
источник
источник
Ответы:
Я бы не рекомендовал писать сложные объекты в 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; }
источник
getApplicationContext
из простого класса?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; }
источник
Context
экземпляру из библиотеки. Ознакомьтесь с другим вопросом SO: возможно ли получить контекст приложения в проекте библиотеки Android?Вместо этого вы можете попробовать использовать 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(); }
источник
String converted = new Gson().toJson(map); SharedPreferences sharedPreferences = getSharedPreferences("sharepref",Context.MODE_PRIVATE); sharedPreferences.edit().putString("yourkey",converted).commit();
источник
карта -> строка
val jsonString: String = Gson().toJson(map) preferences.edit().putString("KEY_MAP_SAVE", jsonString).apply()
строка -> карта
val jsonString: String = preferences.getString("KEY_MAP_SAVE", JSONObject().toString()) val listType = object : TypeToken<Map<String, String>>() {}.type return Gson().fromJson(jsonString, listType)
источник
Вы можете использовать это в специальном файле общих настроек (источник: https://developer.android.com/reference/android/content/SharedPreferences.html ):
источник
Ленивый способ: хранить каждый ключ прямо в SharedPreferences
Для узкого случая использования, когда ваша карта будет иметь не более нескольких десятков элементов, вы можете воспользоваться тем фактом, что SharedPreferences работает во многом как карта и просто хранит каждую запись под собственным ключом:
Хранение карты
Map<String, String> map = new HashMap<String, String>(); map.put("color", "red"); map.put("type", "fruit"); map.put("name", "Dinsdale"); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); // OR use a specific pref name // context.getSharedPreferences("myMegaMap"); for (Map.Entry<String, String> entry : map.entrySet()) { prefs.edit().putString(entry.getKey(), entry.getValue()); }
Чтение ключей с карты
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); // OR use a specific pref name // context.getSharedPreferences("myMegaMap"); prefs.getString("color", "pampa");
В случае, если вы используете собственное имя предпочтения (т.е.
context.getSharedPreferences("myMegaMap")
), вы также можете получить все ключи с помощьюprefs.getAll()
источник
Я знаю, что уже слишком поздно, но я надеюсь, что это может быть полезно для любого чтения.
так что я делаю
1) Создайте HashMap и добавьте такие данные, как: -
HashMap hashmapobj = new HashMap(); hashmapobj.put(1001, "I"); hashmapobj.put(1002, "Love"); hashmapobj.put(1003, "Java");
2) Напишите это в редактор shareprefrences, например: -
SharedPreferences sharedpreferences = getSharedPreferences(MyPREFERENCES,Context.MODE_PRIVATE); Editor editor = sharedpreferences.edit(); editor.putStringSet("key", hashmapobj ); editor.apply(); //Note: use commit if u wan to receive response from shp
3) Чтение таких данных, как: - в новом классе, где вы хотите, чтобы они были прочитаны
HashMap hashmapobj_RECIVE = new HashMap(); SharedPreferences sharedPreferences (MyPREFERENCES,Context.MODE_PRIVATE; //reading HashMap from sharedPreferences to new empty HashMap object hashmapobj_RECIVE = sharedpreferences.getStringSet("key", null);
источник