HashMap'i Paylaşılan Tercihlere nasıl kaydedebilirim?


Yanıtlar:


84

Karmaşık nesnelerin SharedPreference içine yazılmasını önermem. Onun yerine ObjectOutputStreamonu dahili belleğe yazmak için kullanırdım.

File file = new File(getDir("data", MODE_PRIVATE), "map");    
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(map);
outputStream.flush();
outputStream.close();

6
Bir ObjectInputStream ile.
Kirill Rakhman


Hashmap ne zamandan beri karmaşık bir nesne? Bunu nasıl tahmin ettin?
Pedro Paulo Amorim

78

Kullandığım Gsondönüştürün HashMapiçin Stringkendisine tasarrufu sonra veSharedPrefs

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
gson'dan hashmap nasıl alınır com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT bekleniyordu, ancak 1. satırda BEGIN_ARRAY idi -
Ram,

BEGIN_OBJECT bekleniyordu, ancak BEGIN_ARRAY gerçekleşiyor çünkü HashMap <String, String> HashMap <String, Object> olmalı, değerler her zaman String nesnesiyse herhangi bir sorun yaşamazsınız, ancak bazı anahtarların değeri diff ise String (örneğin özel nesne veya liste veya dizi) sonra istisna atılır. Yani ihtiyacınız olan her şeyi ayrıştırabilmek için HashMap <String, Object>
Stoycho Andreev

44

Haritayı tercihe göre kaydetmek ve haritayı tercihe göre yüklemek için basit bir kod parçası yazdım. GSON veya Jackson işlevi gerekmez. Anahtar olarak String ve değer olarak Boolean olan bir harita kullandım.

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

mükemmel cevap :)
Ramkesh Yadav

getApplicationContextBasit bir sınıftan nasıl erişebilirim ?
Dmitry

@Dmitry Bir kısayol: Basit sınıfınızda, bağlamı belirleme yöntemini ekleyin ve bağlamı üye değişken olarak ayarlayın ve buna göre kullanın
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();

ancak, paylaşılan tercihlere vektör ekliyoruz gibi hash haritasını kendisi gibi kaydetmem gerekiyor
jibysthomas

muhtemelen serileştirmeyi kullanmanız ve serileştirilmiş HashMap'i SharedPrefs'e kaydetmeniz gerekeceğinden. Bunun nasıl yapılacağına dair kod örneklerini kolayca bulabilirsiniz.
hovanessyan

11

Vinoj John Hosan'ın cevabının bir yansıması olarak, yanıtı, tek bir anahtar yerine verilerin anahtarına dayalı olarak daha genel eklemelere izin verecek şekilde değiştirdim "My_map".

Benim uygulamada, MyAppbenim ise Applicationgeçersiz kılma sınıfı ve MyApp.getInstance()geri getirmekte 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;
}

Uygulamama bir kitaplıktan nasıl erişebilirim?
Dmitry

@Dmitry Bunu, Contextörneğe bir kitaplıktan eriştiğiniz şekilde yaparsınız . Şu diğer SO sorusuna bakın: Bir Android Kitaplık Projesinde uygulamanın bağlamını almak mümkün müdür?
Kyle Falconer

2

Bunun yerine JSON kullanmayı deneyebilirsiniz.

Tasarruf için

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
}

Almak için

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
Haritaya nasıl iade edilir?
زياد

1

harita -> dize

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

string -> harita

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

0

Bunu özel bir paylaşılan tercihler dosyasında kullanabilirsiniz (kaynak: https://developer.android.com/reference/android/content/SharedPreferences.html ):

getAll

API seviye 1 Haritasına eklendi getAll () Tüm değerleri tercihlerden alın.

Bu yöntemle döndürülen koleksiyonu veya içeriğini değiştirmemeniz gerektiğini unutmayın. Bunu yaparsanız, depolanan verilerinizin tutarlılığı garanti edilmez.

Harita döndürür Tercihleri ​​temsil eden anahtar / değer çiftlerinin listesini içeren bir harita döndürür.


0

Tembel yol: her anahtarı doğrudan SharedPreferences'da depolamak

Haritanızın yalnızca birkaç düzineden fazla öğeye sahip olmayacağı dar kullanım durumunda, SharedPreferences'ın hemen hemen bir harita gibi çalıştığı ve her girişi kendi anahtarı altında sakladığı gerçeğinden yararlanabilirsiniz:

Haritayı kaydetme

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

Haritadan anahtarları okumak

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

Özel bir tercih adı (yani context.getSharedPreferences("myMegaMap")) kullanmanız durumunda, tüm anahtarları ile de alabilirsiniz.prefs.getAll()

Kişisel değerler SharedPreferences tarafından desteklenen herhangi bir türden olabilir: String, int, long, float, boolean.


-2

Biraz geç olduğunu biliyorum ama umarım okuyan herhangi birine yardımcı olur ..

yani ne yapıyorum

1) HashMap oluşturun ve aşağıdaki gibi veriler ekleyin: -

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

2) Paylaşım kaynağı düzenleyicisine şu şekilde yazın: -

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) Aşağıdaki gibi verileri okumak: - okunmasını istediğiniz yeni bir sınıfta

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

Harita ayarlanmamış
Solidogen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.