Comment enregistrer HashMap dans les préférences partagées?

Réponses:

84

Je ne recommanderais pas d'écrire des objets complexes dans SharedPreference. Au lieu de cela, j'utiliserais ObjectOutputStreampour l'écrire dans la mémoire interne.

File file = new File(getDir("data", MODE_PRIVATE), "map");    
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(map);
outputStream.flush();
outputStream.close();
Kirill Rakhman
la source
6
Avec un ObjectInputStream.
Kirill Rakhman
5
voici un exemple comment utiliser ObjectOutputStream et ObjectInputStream ensemble: tutorialspoint.com/java/io/objectinputstream_readobject.htm
Krzysztof Skrzynecki
Depuis quand Hashmap est un objet complexe? Comment avez-vous supposé cela?
Pedro Paulo Amorim
78

Je l' utilise Gsonpour convertir HashMapà Stringet puis enregistrez - leSharedPrefs

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();
}
penduDev
la source
2
comment obtenir hashmap de gson j'ai eu un msg d'erreur comme com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT attendu mais BEGIN_ARRAY à la ligne 1 colonne 2 -
Ram
BEGIN_OBJECT attendu mais BEGIN_ARRAY se produit car HashMap <String, String> doit être HashMap <String, Object>, si les valeurs sont toujours un objet String, vous n'aurez aucun problème, mais si la valeur d'une clé est diff alors String (par exemple objet personnalisé, ou liste ou tableau) alors l'exception sera levée. Donc, pour pouvoir analyser tout ce dont vous avez besoin HashMap <String, Object>
Stoycho Andreev
43

J'ai écrit un simple morceau de code pour enregistrer la carte de préférence et charger la carte de préférence. Aucune fonction GSON ou Jackson requise. Je viens d'utiliser une carte ayant String comme clé et Boolean comme valeur.

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;
}
Vinoj John Hosan
la source
perfect answer :)
Ramkesh Yadav
Comment puis-je accéder à getApplicationContextpartir d'une classe simple?
Dmitry
@Dmitry Un raccourci: Dans votre classe simple, incluez la méthode set context et définissez le contexte en tant que variable membre et utilisez-le en conséquence
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();
hovanessyan
la source
mais je dois enregistrer la carte de hachage comme elle-même, comme nous ajoutons un vecteur dans les préférences partagées
jibysthomas
que vous devez probablement utiliser la sérialisation et enregistrer le HashMap sérialisé dans SharedPrefs. Vous pouvez facilement trouver des exemples de code sur la façon de procéder.
hovanessyan
11

En tant que spin off de la réponse de Vinoj John Hosan, j'ai modifié la réponse pour permettre des insertions plus génériques, basées sur la clé des données, au lieu d'une seule clé comme "My_map".

Dans mon implémentation, MyAppest ma Applicationclasse de remplacement et MyApp.getInstance()agit pour renvoyer le fichier 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;
}
Kyle Falconer
la source
Comment puis-je accéder à MyApp à partir d'une bibliothèque?
Dmitry
@Dmitry Vous feriez cela de la même manière que vous accéderiez à l' Contextinstance à partir d'une bibliothèque. Consultez cette autre question SO: est-il possible d'obtenir le contexte de l'application dans un projet de bibliothèque Android?
Kyle Falconer
2

Vous pouvez essayer d'utiliser JSON à la place.

Pour économiser

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
}

Pour obtenir

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();
}
Jonas Borggren
la source
1
String converted = new Gson().toJson(map);
SharedPreferences sharedPreferences = getSharedPreferences("sharepref",Context.MODE_PRIVATE);
sharedPreferences.edit().putString("yourkey",converted).commit();

la source
1
Comment le renvoyer à Map?
زياد
1

Utilisation de PowerPreference .

Enregistrer des données

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

Lire les données

HashMap<String, Object> value = PowerPreference.getDefaultFile().getMap("key", HashMap.class, String.class, Object.class);
Ali Asadi
la source
1

map -> chaîne

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

chaîne -> carte

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

Vous pouvez l'utiliser dans un fichier de préférences partagé dédié (source: https://developer.android.com/reference/android/content/SharedPreferences.html ):

Avoir tout

ajouté dans l'API niveau 1 Map getAll () Récupère toutes les valeurs des préférences.

Notez que vous ne devez pas modifier la collection retournée par cette méthode, ni altérer son contenu. La cohérence de vos données stockées n'est pas garantie si vous le faites.

Renvoie Map Renvoie une carte contenant une liste de paires clé / valeur représentant les préférences.

sivi
la source
0

La manière paresseuse: stocker chaque clé directement dans SharedPreferences

Pour le cas d'utilisation restreint où votre carte ne contiendra que quelques dizaines d'éléments, vous pouvez profiter du fait que SharedPreferences fonctionne à peu près comme une carte et stocke simplement chaque entrée sous sa propre clé:

Stocker la carte

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

Lecture des clés de la carte

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

Dans le cas où vous utilisez un nom de préférence personnalisé (c'est-à-dire context.getSharedPreferences("myMegaMap")), vous pouvez également obtenir toutes les clés avecprefs.getAll()

Vos valeurs peuvent être de tout type pris en charge par SharedPreferences: String, int, long, float, boolean.

ccpizza
la source
0

Je sais que c'est un peu trop tard, mais j'espère que cela pourra être utile à n'importe quelle lecture.

alors ce que je fais c'est

1) Créez HashMap et ajoutez des données comme: -

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

2) Écrivez-le pour partager l'éditeur de préférences comme: -

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) Lire des données comme: - dans une nouvelle classe où vous voulez qu'elles soient lues

   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);
TPX
la source