Bagaimana cara menyimpan HashMap ke Preferensi Bersama di Android?
android
sharedpreferences
jibysthomas
sumber
sumber
Jawaban:
Saya tidak akan merekomendasikan menulis objek kompleks ke SharedPreference. Sebagai gantinya saya akan menggunakannya
ObjectOutputStream
untuk 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();
sumber
Saya gunakan
Gson
untuk mengonversiHashMap
keString
dan 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(); }
sumber
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; }
sumber
getApplicationContext
dari kelas sederhana?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();
sumber
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,
MyApp
adalahApplication
kelas timpa saya , danMyApp.getInstance()
bertindak untuk mengembalikancontext
.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; }
sumber
Context
instance dari perpustakaan. Lihat pertanyaan SO lainnya ini: Apakah mungkin untuk mendapatkan konteks aplikasi dalam Proyek Perpustakaan Android?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(); }
sumber
String converted = new Gson().toJson(map); SharedPreferences sharedPreferences = getSharedPreferences("sharepref",Context.MODE_PRIVATE); sharedPreferences.edit().putString("yourkey",converted).commit();
sumber
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)
sumber
Anda dapat menggunakan ini dalam file prefs bersama yang didedikasikan (sumber: https://developer.android.com/reference/android/content/SharedPreferences.html ):
sumber
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()
sumber
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);
sumber