Jak zapisać HashMap we wspólnych preferencjach?


Odpowiedzi:


84

Nie polecałbym pisania złożonych obiektów w SharedPreference. Zamiast tego ObjectOutputStreamzapisał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();

6
Z ObjectInputStream.
Kirill Rakhman,

5
oto przykład, jak używać ObjectOutputStream i ObjectInputStream razem: tutorialspoint.com/java/io/objectinputstream_readobject.htm
Krzysztof Skrzynecki

Od kiedy Hashmap jest złożonym obiektem? Jak to założyłeś?
Pedro Paulo Amorim

79

Używam, Gsonaby przekonwertować HashMapna, Stringa 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();
}

2
jak uzyskać hashmap z gson Otrzymałem komunikat o błędzie, taki jak com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: Oczekiwano BEGIN_OBJECT, ale był BEGIN_ARRAY w wierszu 1 kolumna 2 -
Ram

Oczekiwano BEGIN_OBJECT, ale wystąpiło BEGIN_ARRAY, ponieważ HashMap <String, String> powinno być HashMap <String, Object>, jeśli wartości są zawsze obiektem String, nie będziesz mieć żadnych problemów, ale jeśli wartość jakiegoś klucza jest diff, to String (na przykład obiekt niestandardowy, lista lub tablica), zostanie zgłoszony wyjątek. Aby móc przeanalizować wszystko, czego potrzebujesz, HashMap <String, Object>
Stoycho Andreev

45

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;
}

doskonała odpowiedź :)
Ramkesh Yadav

Jak mogę uzyskać dostęp getApplicationContextz prostej klasy?
Dmitry

@Dmitry Skrót: w swojej prostej klasie uwzględnij metodę ustawiania kontekstu i ustaw kontekst jako zmienną składową i używaj jej odpowiednio
Vinoj John Hosan

32
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();

ale muszę zapisać mapę skrótów jako samą siebie, tak jak dodajemy wektor do wspólnych preferencji
jibysthomas

niż prawdopodobnie musisz użyć serializacji i zapisać serializowaną HashMap w SharedPrefs. Możesz łatwo znaleźć przykłady kodu, jak to zrobić.
hovanessyan

11

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 MyAppjest moją Applicationklasą przesłaniającą i MyApp.getInstance()działa, aby zwrócić plik 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;
}

Jak mogę uzyskać dostęp do MyApp z biblioteki?
Dmitry

@Dmitry Zrobiłbyś to w ten sam sposób, w jaki uzyskiwałbyś dostęp do Contextinstancji z biblioteki. Sprawdź inne pytanie SO: Czy można uzyskać kontekst aplikacji w projekcie biblioteki systemu Android?
Kyle Falconer

2

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

1
String converted = new Gson().toJson(map);
SharedPreferences sharedPreferences = getSharedPreferences("sharepref",Context.MODE_PRIVATE);
sharedPreferences.edit().putString("yourkey",converted).commit();

1
Jak zwrócić go do mapy?
زياد

1

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)

0

Możesz tego użyć w dedykowanym pliku o udostępnionych preferencjach (źródło: https://developer.android.com/reference/android/content/SharedPreferences.html ):

getAll

dodana w API poziomu 1 Mapa getAll () Pobiera wszystkie wartości z preferencji.

Pamiętaj, że nie możesz modyfikować kolekcji zwróconej przez tę metodę ani zmieniać żadnej z jej zawartości. W takim przypadku spójność przechowywanych danych nie jest gwarantowana.

Zwraca mapę Zwraca mapę zawierającą listę par klucz / wartość reprezentujących preferencje.


0

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()

Twoje wartości mogą być dowolnego typu obsługiwanego przez SharedPreferences: String, int, long, float, boolean.


-2

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);

Mapa nie jest zestawem
Solidogen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.