एंड्रॉइड में मैं साझा करने के लिए एक HashMap कैसे बचा सकता हूं ?
एंड्रॉइड में मैं साझा करने के लिए एक HashMap कैसे बचा सकता हूं ?
जवाबों:
मैं जटिल वस्तुओं को SharedPreference में लिखने की अनुशंसा नहीं करूँगा। इसके बजाय मैं ObjectOutputStream
इसे आंतरिक मेमोरी में लिखने के लिए उपयोग करूंगा ।
File file = new File(getDir("data", MODE_PRIVATE), "map");
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(map);
outputStream.flush();
outputStream.close();
मैं Gson
कन्वर्ट करने के HashMap
लिए String
और फिर इसे सेव करने के लिए उपयोग करता हूंSharedPrefs
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();
}
मैंने मानचित्र को वरीयता में सहेजने और मानचित्र को वरीयता से लोड करने के लिए एक सरल कोड लिखा है। कोई GSON या जैक्सन फ़ंक्शन की आवश्यकता नहीं है। मैंने केवल एक स्ट्रिंग का उपयोग किया है जिसमें मूल्य के रूप में कुंजी और बूलियन के रूप में स्ट्रिंग है।
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
एक साधारण वर्ग से कैसे पहुंच सकता हूं ?
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();
वीनोज जॉन होसन के जवाब के स्पिन ऑफ के रूप में, मैंने डेटा की कुंजी के आधार पर, एक जैसे कुंजी के बजाय अधिक सामान्य सम्मिलन की अनुमति देने के लिए उत्तर को संशोधित किया। "My_map"
।
मेरे कार्यान्वयन में, MyApp
मेरा Application
ओवरराइड वर्ग है, और MyApp.getInstance()
वापस लौटने के लिए कार्य करता है 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
किसी लायब्रेरी से इंस्टेंस तक पहुँच प्राप्त करेंगे । इस अन्य एसओ प्रश्न को देखें: क्या एंड्रॉइड लाइब्रेरी प्रोजेक्ट में एप्लिकेशन का संदर्भ प्राप्त करना संभव है?
आप इसके बजाय JSON का उपयोग करने का प्रयास कर सकते हैं।
बचत के लिए
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
}
पाने के लिए
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();
PowerPreference का उपयोग करना ।
डेटा बचाना
HashMap<String, Object> hashMap = new HashMap<String, Object>();
PowerPreference.getDefaultFile().put("key",hashMap);
डेटा पढ़ें
HashMap<String, Object> value = PowerPreference.getDefaultFile().getMap("key", HashMap.class, String.class, Object.class);
नक्शा -> स्ट्रिंग
val jsonString: String = Gson().toJson(map)
preferences.edit().putString("KEY_MAP_SAVE", jsonString).apply()
स्ट्रिंग -> नक्शा
val jsonString: String = preferences.getString("KEY_MAP_SAVE", JSONObject().toString())
val listType = object : TypeToken<Map<String, String>>() {}.type
return Gson().fromJson(jsonString, listType)
आप इसे साझा प्रीफ़्स फ़ाइल (स्रोत: https://developer.android.com/reference/android/content/SaringPreferences.html ) पर समर्पित में उपयोग कर सकते हैं :
सब प्राप्त कर लिया
एपीआई स्तर 1 में जोड़ा गया नक्शा getAll () वरीयताओं से सभी मूल्यों को पुनः प्राप्त करें।
ध्यान दें कि आपको इस विधि द्वारा लौटाए गए संग्रह को संशोधित नहीं करना चाहिए, या इसकी किसी भी सामग्री में परिवर्तन नहीं करना चाहिए। यदि आप करते हैं तो आपके संग्रहीत डेटा की स्थिरता की गारंटी नहीं है।
रिटर्न मैप्स उन मानचित्रों की सूची देता है जिनमें वरीयताओं का प्रतिनिधित्व करने वाले जोड़े कुंजी / मूल्य की एक सूची होती है।
संकीर्ण उपयोग के मामले के लिए जब आपका नक्शा केवल कुछ दर्जन से अधिक तत्वों से भरा न हो, तो आप इस तथ्य का लाभ उठा सकते हैं कि SharedPreferences नक्शे की तरह बहुत काम करता है और बस प्रत्येक प्रविष्टि को अपनी कुंजी के तहत संग्रहीत करता है:
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");
ऐसे मामले में जहां आप एक कस्टम वरीयता नाम (यानी context.getSharedPreferences("myMegaMap")
) का उपयोग करते हैं, आप सभी कुंजी भी प्राप्त कर सकते हैंprefs.getAll()
आपका मान किसी भी प्रकार SharedPreferences द्वारा समर्थित हो सकता है:
String
,int
,long
,float
,boolean
।
मुझे इसकी थोड़ी बहुत देर हो चुकी है, लेकिन मुझे उम्मीद है कि यह किसी भी पढ़ने के लिए उपयोगी हो सकता है।
तो मैं क्या कर रहा हूँ
1) हैशपेंड जोड़ें जैसे डेटा जोड़ें: -
HashMap hashmapobj = new HashMap();
hashmapobj.put(1001, "I");
hashmapobj.put(1002, "Love");
hashmapobj.put(1003, "Java");
2) इसे शेयरहोल्डर के संपादक की तरह लिखें: -
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) डेटा पढ़ना जैसे: - एक नई कक्षा में जहाँ आप इसे पढ़ना चाहते हैं
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);