Bagaimana cara menyimpan HashMap ke Preferensi Bersama di Android?
Bagaimana cara menyimpan HashMap ke Preferensi Bersama di Android?
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();
Saya gunakan Gson
untuk mengonversi HashMap
ke String
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();
}
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;
}
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();
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
adalah Application
kelas 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;
}
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();
}
String converted = new Gson().toJson(map);
SharedPreferences sharedPreferences = getSharedPreferences("sharepref",Context.MODE_PRIVATE);
sharedPreferences.edit().putString("yourkey",converted).commit();
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)
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.
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:
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());
}
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
.
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);