Jak mogę zapisać HashMap we wspólnych preferencjach w systemie Android?
android
sharedpreferences
jibysthomas
źródło
źródło
Odpowiedzi:
Nie polecałbym pisania złożonych obiektów w SharedPreference. Zamiast tego
ObjectOutputStream
zapisałbym go do pamięci wewnętrznej.File file = new File(getDir("data", MODE_PRIVATE), "map"); ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file)); outputStream.writeObject(map); outputStream.flush(); outputStream.close();
źródło
Używam,
Gson
aby przekonwertowaćHashMap
na,String
a następnie zapisać naSharedPrefs
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(); }
źródło
Napisałem prosty fragment kodu, aby zapisać mapę w preferencjach i załadować mapę z preferencji. Nie są wymagane żadne funkcje GSON ani Jacksona. Właśnie użyłem mapy mającej String jako klucz i Boolean jako wartość.
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; }
źródło
getApplicationContext
z prostej klasy?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();
źródło
Jako spin-off odpowiedzi Vinoj John Hosan, zmodyfikowałem odpowiedź, aby umożliwić bardziej ogólne wstawianie na podstawie klucza danych, zamiast pojedynczego klucza, takiego jak
"My_map"
.W mojej implementacji
MyApp
jest mojąApplication
klasą przesłaniającą iMyApp.getInstance()
działa, aby zwrócić plikcontext
.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; }
źródło
Context
instancji z biblioteki. Sprawdź inne pytanie SO: Czy można uzyskać kontekst aplikacji w projekcie biblioteki systemu Android?Zamiast tego możesz spróbować użyć formatu JSON.
Za oszczędzanie
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 }
Za zdobycie
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(); }
źródło
String converted = new Gson().toJson(map); SharedPreferences sharedPreferences = getSharedPreferences("sharepref",Context.MODE_PRIVATE); sharedPreferences.edit().putString("yourkey",converted).commit();
źródło
mapa -> ciąg
val jsonString: String = Gson().toJson(map) preferences.edit().putString("KEY_MAP_SAVE", jsonString).apply()
string -> map
val jsonString: String = preferences.getString("KEY_MAP_SAVE", JSONObject().toString()) val listType = object : TypeToken<Map<String, String>>() {}.type return Gson().fromJson(jsonString, listType)
źródło
Możesz tego użyć w dedykowanym pliku o udostępnionych preferencjach (źródło: https://developer.android.com/reference/android/content/SharedPreferences.html ):
źródło
Leniwy sposób: przechowywanie każdego klucza bezpośrednio w SharedPreferences
W wąskim przypadku użycia, gdy twoja mapa ma mieć nie więcej niż kilkadziesiąt elementów, możesz skorzystać z faktu, że SharedPreferences działa prawie jak mapa i po prostu przechowuj każdy wpis pod własnym kluczem:
Przechowywanie mapy
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()); }
Czytanie kluczy z mapy
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); // OR use a specific pref name // context.getSharedPreferences("myMegaMap"); prefs.getString("color", "pampa");
W przypadku, gdy używasz niestandardowej nazwy preferencji (tj.
context.getSharedPreferences("myMegaMap")
), Możesz również uzyskać wszystkie klucze za pomocąprefs.getAll()
źródło
Wiem, że jest trochę za późno, ale mam nadzieję, że przyda się to każdemu czytaniu.
więc co ja robię
1) Utwórz HashMap i dodaj dane takie jak: -
HashMap hashmapobj = new HashMap(); hashmapobj.put(1001, "I"); hashmapobj.put(1002, "Love"); hashmapobj.put(1003, "Java");
2) Napisz go do edytora shareprefrences, takiego jak: -
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) Odczytywanie danych, takich jak: - w nowej klasie, w której chcesz je odczytać
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);
źródło