ভাগ করা পছন্দগুলিতে হ্যাশম্যাপকে কীভাবে সংরক্ষণ করবেন?


উত্তর:


85

আমি জটিল বস্তুগুলি SharedPreferences এ লেখার পরামর্শ দেব না। পরিবর্তে আমি 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
একটি অবজেক্ট ইনপুট স্ট্রিম সহ।
কিরিল রাখমান

4
: এখানে একটি উদাহরণ একসঙ্গে ObjectOutputStream এবং ObjectInputStream কীভাবে ব্যবহার করবেন তা হল tutorialspoint.com/java/io/objectinputstream_readobject.htm
Krzysztof Skrzynecki

যেহেতু হাশম্যাপ একটি জটিল অবজেক্ট? আপনি এটি কীভাবে ধরে নিয়েছেন?
পেড্রো পাওলো আমোরিম

79

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

4
কীভাবে জিএসন থেকে হ্যাশম্যাপ পাবেন আমি ত্রুটি পেয়েছি যেমন com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: প্রত্যাশিত BEGIN_OBJECT তবে লাইন 1 কলাম 2 তে BEGIN_ARRAY ছিল
রাম

প্রত্যাশিত BEGIN_OBJECT কিন্তু BEGIN_ARRAY হচ্ছিল কারণ হ্যাশম্যাপ <স্ট্রিং, স্ট্রিং> হ্যাশম্যাপ <স্ট্রিং, অবজেক্ট> হওয়া উচিত, মানগুলি যদি সর্বদা স্ট্রিং অবজেক্ট থাকে তবে আপনার কোনও সমস্যা হবে না তবে কিছু কী এর মান পৃথক থাকলে স্ট্রিং (উদাহরণস্বরূপ) কাস্টম অবজেক্ট, বা তালিকা বা অ্যারে) তারপরে ব্যতিক্রম ছুঁড়ে দেওয়া হবে। সুতরাং আপনার যা দরকার তা হ্যাশম্যাপ <স্ট্রিং, অবজেক্ট>
স্টোইচো অ্যান্ড্রিভ

45

অগ্রাধিকারে মানচিত্রটি সংরক্ষণ এবং মানচিত্রটি পছন্দ থেকে লোড করার জন্য আমি একটি সাধারণ কোডের টুকরো লিখেছি। কোনও জিএসএন বা জ্যাকসন ফাংশন প্রয়োজন। আমি সারণীতে কী হিসাবে স্ট্রিং এবং মান হিসাবে বুলিয়ান একটি মানচিত্র ব্যবহার করেছি।

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সাধারণ ক্লাস থেকে অ্যাক্সেস করতে পারি ?
দিমিত্রি

@ দিমিত্রি একটি শর্টকাট: আপনার সাধারণ শ্রেণিতে, প্রাসঙ্গিক পদ্ধতিটি নির্ধারণ করুন এবং প্রসঙ্গটি সদস্য ভেরিয়েবল হিসাবে সেট করুন এবং সেই অনুযায়ী ব্যবহার করুন
ভিনোজ জন হোসান

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

আপনাকে সম্ভবত সিরিয়ালাইজেশন ব্যবহার করতে হবে এবং শেয়ারডপ্রেসগুলিতে সিরিয়ালযুক্ত হ্যাশম্যাপ সংরক্ষণ করুন। এটি কীভাবে করা যায় সে সম্পর্কে আপনি সহজেই কোড-উদাহরণগুলি খুঁজে পেতে পারেন।
hovanessyan

12

ভিনোজ জন হোসানের উত্তরের স্পিন হিসাবে, আমি কোনও সিঙ্কের পরিবর্তে ডেটার কীটির উপর ভিত্তি করে আরও জেনেরিক সন্নিবেশের অনুমতি দেওয়ার জন্য উত্তরটি পরিবর্তন করেছি "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কোনও লাইব্রেরি থেকে উদাহরণটি অ্যাক্সেস করবেন সেভাবে আপনি এটি করবেন । এই অন্যান্য এসও প্রশ্নটি দেখুন: কোনও অ্যান্ড্রয়েড লাইব্রেরি প্রকল্পে অ্যাপ্লিকেশনের প্রসঙ্গটি পাওয়া কি সম্ভব?
কাইল ফ্যালকনার

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

4
কীভাবে এটি মানচিত্রে ফেরত পাবেন?
زياد

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/references/android/content/SharedPreferences.html ):

getAll

এপিআই স্তর 1 ম্যাপে যুক্ত করা হয়েছে সমস্ত মানটি পছন্দ থেকে পুনরুদ্ধার করুন)

মনে রাখবেন যে আপনাকে এই পদ্ধতিতে ফিরে আসা সংগ্রহটি পরিবর্তন করতে হবে না বা এর কোনও বিষয়বস্তু পরিবর্তন করতে হবে না। আপনি যদি করেন তবে আপনার সঞ্চিত ডেটাটির ধারাবাহিকতা গ্যারান্টিযুক্ত নয়।

রিটার্ন ম্যাপ পছন্দগুলি প্রতিনিধিত্ব করে জোড় কী / মানের তালিকা সহ একটি মানচিত্র ফেরত দেয়।


0

অলস উপায়: প্রতিটি কী সরাসরি শেয়ার্ডপ্রিফারেন্সিতে সঞ্চয় করে

সংকীর্ণ ব্যবহারের ক্ষেত্রে যখন আপনার মানচিত্রে কেবল কয়েক ডজন উপাদান ছাড়া আর কিছু থাকবে না আপনি 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


-2

আমি এটিকে কিছুটা দেরিতে জানি তবে আমি আশা করি এটি যে কোনও একটির পড়ার ক্ষেত্রে সহায়ক হতে পারে ..

সুতরাং আমি কি করি

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

মানচিত্র কোনও সেট নয়
সলিডোজেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.