साझा प्रेफरेंस के लिए HashMap को कैसे बचाएं?


जवाबों:


84

मैं जटिल वस्तुओं को 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();

6
एक ObjectInputStream के साथ।
किरिल रहमान

5
यहाँ एक उदाहरण दिया गया है कि कैसे ObjectOutputStream और ObjectInputStream का एक साथ उपयोग किया जाता है: tutorialspoint.com/java/io/objectinputstream_readobject.htm
Krzysztof

हशमप कब से एक जटिल वस्तु है? आपने यह कैसे मान लिया?
पेड्रो पाउलो एमोरिम

78

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

2
गेसम से हैशमैप कैसे प्राप्त करें i। त्रुटि संदेश मिला जैसे com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: अपेक्षित BEGIN_OBJECT लेकिन पंक्ति 1 कॉलम 2 में BEGIN_ARRAY
राम

अपेक्षित BEGIN_OBJECT लेकिन BEGIN_ARRAY इसलिए हो रहा है क्योंकि HashMap <String, String> को HashMap <String, Object> होना चाहिए, यदि मान हमेशा String ऑब्जेक्ट हैं, तो आपके पास कोई भी नहीं होगा, लेकिन यदि कुछ कुंजी का मान भिन्न है, तो स्ट्रिंग (उदाहरण के लिए) कस्टम ऑब्जेक्ट, या सूची या सरणी) तो अपवाद फेंक दिया जाएगा। तो सब कुछ वापस करने में सक्षम होने के लिए आपको HashMap <String, Object>
Stoycho Andreev

43

मैंने मानचित्र को वरीयता में सहेजने और मानचित्र को वरीयता से लोड करने के लिए एक सरल कोड लिखा है। कोई 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एक साधारण वर्ग से कैसे पहुंच सकता हूं ?
दिमित्री

@Dmitry एक शॉर्टकट: अपने साधारण वर्ग में, संदर्भ विधि सेट करें और संदर्भ को सदस्य चर के रूप में सेट करें और तदनुसार उपयोग करें
विनोज जॉन होसन

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

लेकिन मुझे हैश मैप को बचाने की आवश्यकता है क्योंकि हम साझा प्राथमिकताओं में वेक्टर जोड़ रहे हैं
jibysthomas

संभवत: आपको क्रमांकन का उपयोग करना होगा और SharedPrefs में क्रमबद्ध HashMap को सहेजना होगा। आप आसानी से कोड-उदाहरण पा सकते हैं कि यह कैसे करना है।
hovanessyan

11

वीनोज जॉन होसन के जवाब के स्पिन ऑफ के रूप में, मैंने डेटा की कुंजी के आधार पर, एक जैसे कुंजी के बजाय अधिक सामान्य सम्मिलन की अनुमति देने के लिए उत्तर को संशोधित किया। "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;
}

मैं लाइब्रेरी से MyApp तक कैसे पहुंच सकता हूं?
दिमित्री

@Dmitry आप इसे उसी तरह से करेंगे जैसे आप Contextकिसी लायब्रेरी से इंस्टेंस तक पहुँच प्राप्त करेंगे । इस अन्य एसओ प्रश्न को देखें: क्या एंड्रॉइड लाइब्रेरी प्रोजेक्ट में एप्लिकेशन का संदर्भ प्राप्त करना संभव है?
काइल फाल्कनर

2

आप इसके बजाय 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();
}

1
String converted = new Gson().toJson(map);
SharedPreferences sharedPreferences = getSharedPreferences("sharepref",Context.MODE_PRIVATE);
sharedPreferences.edit().putString("yourkey",converted).commit();

1
इसे मैप पर कैसे लौटाएं?
زياد

1

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

1

नक्शा -> स्ट्रिंग

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)

0

आप इसे साझा प्रीफ़्स फ़ाइल (स्रोत: https://developer.android.com/reference/android/content/SaringPreferences.html ) पर समर्पित में उपयोग कर सकते हैं :

सब प्राप्त कर लिया

एपीआई स्तर 1 में जोड़ा गया नक्शा getAll () वरीयताओं से सभी मूल्यों को पुनः प्राप्त करें।

ध्यान दें कि आपको इस विधि द्वारा लौटाए गए संग्रह को संशोधित नहीं करना चाहिए, या इसकी किसी भी सामग्री में परिवर्तन नहीं करना चाहिए। यदि आप करते हैं तो आपके संग्रहीत डेटा की स्थिरता की गारंटी नहीं है।

रिटर्न मैप्स उन मानचित्रों की सूची देता है जिनमें वरीयताओं का प्रतिनिधित्व करने वाले जोड़े कुंजी / मूल्य की एक सूची होती है।


0

आलसी तरीका: प्रत्येक कुंजी को सीधे SharedPreferences में संग्रहीत करना

संकीर्ण उपयोग के मामले के लिए जब आपका नक्शा केवल कुछ दर्जन से अधिक तत्वों से भरा न हो, तो आप इस तथ्य का लाभ उठा सकते हैं कि 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


0

मुझे इसकी थोड़ी बहुत देर हो चुकी है, लेकिन मुझे उम्मीद है कि यह किसी भी पढ़ने के लिए उपयोगी हो सकता है।

तो मैं क्या कर रहा हूँ

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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.