Come salvare HashMap nelle preferenze condivise?


Risposte:


84

Non consiglierei di scrivere oggetti complessi in SharedPreference. Invece lo userei ObjectOutputStreamper scriverlo nella 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();

6
Con un ObjectInputStream.
Kirill Rakhman

5
ecco un esempio di come utilizzare ObjectOutputStream e ObjectInputStream insieme: tutorialspoint.com/java/io/objectinputstream_readobject.htm
Krzysztof Skrzynecki

Da quando Hashmap è un oggetto complesso? Come l'hai assunto?
Pedro Paulo Amorim

78

Uso Gsonper convertire HashMapin Stringe poi salvarlo inSharedPrefs

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
come ottenere hashmap da gson ho ricevuto messaggi di errore come com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: previsto BEGIN_OBJECT ma era BEGIN_ARRAY alla riga 1 colonna 2 -
Ram

Previsto BEGIN_OBJECT ma era BEGIN_ARRAY sta accadendo perché HashMap <String, String> dovrebbe essere HashMap <String, Object>, se i valori sono sempre String oggetto non avrai problemi ma se il valore di qualche chiave è diff allora String (ad esempio oggetto personalizzato, elenco o array), verrà generata un'eccezione. Quindi, per essere in grado di analizzare tutto ciò di cui hai bisogno HashMap <String, Object>
Stoycho Andreev

43

Ho scritto un semplice pezzo di codice per salvare la mappa nelle preferenze e caricare la mappa dalle preferenze. Nessuna funzione GSON o Jackson richiesta. Ho appena usato una mappa con String come chiave e Boolean come valore.

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

risposta perfetta :)
Ramkesh Yadav

Come posso accedere getApplicationContextda una classe semplice?
Dmitry

@Dmitry Una scorciatoia: nella tua classe semplice, includi il metodo set context e imposta il contesto come variabile membro e
usalo di

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

ma
devo

di quello che devi probabilmente usare la serializzazione e salvare la HashMap serializzata in SharedPrefs. Puoi facilmente trovare esempi di codice su come farlo.
hovanessyan

11

Come spin off della risposta di Vinoj John Hosan, ho modificato la risposta per consentire inserimenti più generici, basati sulla chiave dei dati, invece di una singola chiave come "My_map".

Nella mia implementazione, MyAppè la mia Applicationclasse override e MyApp.getInstance()agisce per restituire il file 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;
}

Come posso accedere a MyApp da una libreria?
Dmitry

@Dmitry Lo faresti nello stesso modo in cui accederesti Contextall'istanza da una libreria. Dai un'occhiata a quest'altra domanda SO: è possibile ottenere il contesto dell'applicazione in un progetto di libreria Android?
Kyle Falconer

2

Potresti provare a utilizzare JSON invece.

Per il risparmio

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
}

Per ottenere

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
Come restituirlo alla mappa?
زياد

1

Utilizzo di PowerPreference .

Salvare i dati

HashMap<String, Object> hashMap = new HashMap<String, Object>();
PowerPreference.getDefaultFile().put("key",hashMap);

Leggere i dati

HashMap<String, Object> value = PowerPreference.getDefaultFile().getMap("key", HashMap.class, String.class, Object.class);

1

mappa -> stringa

val jsonString: String  = Gson().toJson(map)
preferences.edit().putString("KEY_MAP_SAVE", jsonString).apply()

stringa -> mappa

val jsonString: String = preferences.getString("KEY_MAP_SAVE", JSONObject().toString())
val listType = object : TypeToken<Map<String, String>>() {}.type
return Gson().fromJson(jsonString, listType)

0

Puoi usarlo in un file di preferenze condiviso dedicato (fonte: https://developer.android.com/reference/android/content/SharedPreferences.html ):

prendi tutto

aggiunto nel livello API 1 Mappa getAll () Recupera tutti i valori dalle preferenze.

Notare che non è necessario modificare la raccolta restituita da questo metodo o alterarne il contenuto. In tal caso, la coerenza dei dati memorizzati non è garantita.

Restituisce Mappa Restituisce una mappa contenente un elenco di coppie chiave / valore che rappresentano le preferenze.


0

Il modo pigro: archiviare ogni chiave direttamente in SharedPreferences

Per il caso d'uso ristretto in cui la tua mappa non avrà più di poche dozzine di elementi puoi approfittare del fatto che SharedPreferences funziona praticamente come una mappa e archivia semplicemente ogni voce con la propria chiave:

Memorizzazione della mappa

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

Chiavi di lettura dalla mappa

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
// OR use a specific pref name
// context.getSharedPreferences("myMegaMap");
prefs.getString("color", "pampa");

Nel caso in cui utilizzi un nome di preferenza personalizzato (cioè context.getSharedPreferences("myMegaMap")) puoi anche ottenere tutte le chiavi conprefs.getAll()

I vostri valori possono essere di qualsiasi tipo supportato dal SharedPreferences: String, int, long, float, boolean.


0

So che è un po 'troppo tardi ma spero che questo possa essere utile a chiunque legga ..

quindi quello che faccio è

1) Crea HashMap e aggiungi dati come: -

HashMap hashmapobj = new HashMap();
  hashmapobj.put(1001, "I");
  hashmapobj.put(1002, "Love");
  hashmapobj.put(1003, "Java");

2) Scrivilo nell'editor di shareprefrences come: -

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) Leggere dati come: - in una nuova classe in cui vuoi che vengano letti

   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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.