Bagaimana cara menyimpan HashMap ke Preferensi Bersama?

Jawaban:

84

Saya tidak akan merekomendasikan menulis objek kompleks ke SharedPreference. Sebagai gantinya saya akan menggunakannya ObjectOutputStreamuntuk menuliskannya ke memori internal.

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
sumber
6
Dengan ObjectInputStream.
Kirill Rakhman
5
berikut adalah contoh cara menggunakan ObjectOutputStream dan ObjectInputStream bersama-sama: tutorialspoint.com/java/io/objectinputstream_readobject.htm
Krzysztof Skrzynecki
Sejak kapan Hashmap menjadi objek yang kompleks? Bagaimana Anda mengasumsikan ini?
Pedro Paulo Amorim
78

Saya gunakan Gsonuntuk mengonversi HashMapke Stringdan kemudian menyimpannya keSharedPrefs

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
sumber
2
cara mendapatkan hashmap dari gson saya mendapat pesan kesalahan seperti com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: Diharapkan BEGIN_OBJECT tetapi BEGIN_ARRAY pada baris 1 kolom 2 -
Ram
Diharapkan BEGIN_OBJECT tetapi BEGIN_ARRAY terjadi karena HashMap <String, String> harus HashMap <String, Object>, jika nilainya selalu objek String Anda tidak akan mengalami masalah tetapi jika nilai beberapa kunci berbeda maka String (misalnya objek kustom, atau daftar atau larik) maka pengecualian akan dilempar. Jadi untuk dapat mengurai kembali semua yang Anda butuhkan HashMap <String, Object>
Stoycho Andreev
44

Saya telah menulis sepotong kode sederhana untuk menyimpan peta dalam preferensi dan memuat peta dari preferensi. Tidak diperlukan fungsi GSON atau Jackson. Saya baru saja menggunakan peta yang memiliki String sebagai kunci dan Boolean sebagai nilai.

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
sumber
jawaban sempurna :)
Ramkesh Yadav
Bagaimana saya bisa mengakses getApplicationContextdari kelas sederhana?
Dmitry
@Dmitry Pintasan: Di kelas sederhana Anda, sertakan metode konteks set dan setel konteks sebagai variabel anggota dan gunakan sesuai
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.dll
sumber
tetapi saya perlu menyimpan peta hash itu sendiri seperti kita menambahkan vektor ke preferensi bersama
jibysthomas
daripada Anda mungkin harus menggunakan serialisasi dan menyimpan HashMap berseri di SharedPrefs. Anda dapat dengan mudah menemukan contoh kode tentang cara melakukannya.
hovanessyan
11

Sebagai spin off dari jawaban Vinoj John Hosan, saya memodifikasi jawaban untuk memungkinkan penyisipan yang lebih umum, berdasarkan kunci data, bukan kunci tunggal seperti "My_map".

Dalam implementasinya, MyAppadalah Applicationkelas timpa saya , dan MyApp.getInstance()bertindak untuk mengembalikan 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
sumber
Bagaimana saya bisa mengakses MyApp dari perpustakaan?
Dmitry
@Dmitry Anda akan melakukan ini dengan cara yang sama seperti Anda mengakses Contextinstance dari perpustakaan. Lihat pertanyaan SO lainnya ini: Apakah mungkin untuk mendapatkan konteks aplikasi dalam Proyek Perpustakaan Android?
Kyle Falconer
2

Anda dapat mencoba menggunakan JSON sebagai gantinya.

Untuk menabung

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
}

Untuk mendapatkan

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

sumber
1
Bagaimana cara mengembalikannya ke Peta?
زياد
1

peta -> string

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

string -> peta

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

Anda dapat menggunakan ini dalam file prefs bersama yang didedikasikan (sumber: https://developer.android.com/reference/android/content/SharedPreferences.html ):

dapat semua

ditambahkan di API level 1 Peta getAll () Ambil semua nilai dari preferensi.

Perhatikan bahwa Anda tidak boleh mengubah koleksi yang dikembalikan dengan metode ini, atau mengubah isinya. Konsistensi data yang disimpan tidak dijamin jika Anda melakukannya.

Returns Map Mengembalikan peta yang berisi daftar pasangan kunci / nilai yang mewakili preferensi.

sivi
sumber
0

Cara malas: menyimpan setiap kunci secara langsung di SharedPreferences

Untuk kasus penggunaan yang sempit ketika peta Anda hanya akan memiliki tidak lebih dari beberapa lusin elemen, Anda dapat memanfaatkan fakta bahwa SharedPreferences berfungsi hampir seperti peta dan cukup menyimpan setiap entri di bawah kuncinya sendiri:

Menyimpan peta

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

Membaca kunci dari peta

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

Jika Anda menggunakan nama preferensi kustom (mis. context.getSharedPreferences("myMegaMap")), Anda juga bisa mendapatkan semua kunci denganprefs.getAll()

Nilai-nilai Anda dapat dari setiap jenis yang didukung oleh SharedPreferences: String, int, long, float, boolean.

ccpizza
sumber
-2

Saya tahu ini agak terlambat tetapi saya harap ini bisa membantu siapa pun yang membaca ..

jadi yang saya lakukan adalah

1) Buat HashMap dan tambahkan data seperti: -

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

2) Tuliskan ke editor shareprefrences seperti: -

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) Membaca data seperti: - di kelas baru yang Anda inginkan untuk dibaca

   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
sumber
Peta bukan satu set
Solidogen