จะบันทึก HashMap เป็น Shared Preferences ได้อย่างไร?


คำตอบ:


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
Kirill Rakhman

5
นี่คือตัวอย่างวิธีการใช้ ObjectOutputStream และ ObjectInputStream ร่วมกัน: tutorialspoint.com/java/io/objectinputstream_readobject.htm
Krzysztof Skrzynecki

ตั้งแต่เมื่อไรที่ Hashmap เป็นวัตถุที่ซับซ้อน? คุณคิดอย่างไร
Pedro Paulo Amorim

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

2
วิธีรับ hashmap จาก gson ฉันได้รับ error msg เช่น com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: คาดว่าจะเป็น BEGIN_OBJECT แต่เป็น BEGIN_ARRAY ที่บรรทัด 1 คอลัมน์ 2 -
ราม

คาดหวัง BEGIN_OBJECT แต่เป็น BEGIN_ARRAY เกิดขึ้นเนื่องจาก HashMap <String, String> ควรเป็น HashMap <String, Object> หากค่าเป็นวัตถุ String เสมอคุณจะไม่มีปัญหาใด ๆ แต่ถ้าค่าของคีย์บางคีย์แตกต่างกันดังนั้น String (ตัวอย่างเช่น วัตถุที่กำหนดเองหรือรายการหรืออาร์เรย์) จากนั้นข้อยกเว้นจะถูกโยนทิ้ง ดังนั้นเพื่อให้สามารถแยกวิเคราะห์ทุกสิ่งที่คุณต้องการ HashMap <String, Object>
Stoycho Andreev

45

ฉันได้เขียนโค้ดง่ายๆเพื่อบันทึกแผนที่ตามความต้องการและโหลดแผนที่จากความชอบ ไม่จำเป็นต้องใช้ฟังก์ชัน GSON หรือ Jackson ฉันเพิ่งใช้แผนที่ที่มี String เป็นคีย์และบูลีนเป็นค่า

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

คำตอบที่สมบูรณ์แบบ :)
Ramkesh Yadav

ฉันจะเข้าถึงgetApplicationContextจากชั้นเรียนธรรมดาได้อย่างไร
Dmitry

@Dmitry ทางลัด: ในชั้นเรียนง่ายๆของคุณรวมวิธีการตั้งค่าบริบทและตั้งค่าบริบทเป็นตัวแปรสมาชิกและใช้ตามนั้น
Vinoj John Hosan

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

มากกว่าที่คุณจะต้องใช้การทำให้เป็นอนุกรมและบันทึก HashMap แบบอนุกรมใน SharedPrefs คุณสามารถค้นหาตัวอย่างโค้ดเกี่ยวกับการทำเช่นนั้นได้อย่างง่ายดาย
hovanessyan

11

ในการแยกคำตอบของ Vinoj John Hosan ฉันได้แก้ไขคำตอบเพื่อให้สามารถแทรกข้อมูลทั่วไปได้มากขึ้นโดยยึดตามคีย์ของข้อมูลแทนที่จะเป็นคีย์เดียวเช่น "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

@Dmitry คุณจะทำในลักษณะเดียวกับที่คุณจะเข้าถึงContextอินสแตนซ์จากไลบรารี ลองดูคำถาม SO อื่น ๆ นี้: เป็นไปได้ไหมที่จะรับบริบทของแอปพลิเคชันในโครงการห้องสมุด Android
Kyle Falconer

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

แผนที่ -> สตริง

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

คุณสามารถใช้สิ่งนี้ในไฟล์ prefs ที่แชร์โดยเฉพาะ (ที่มา: https://developer.android.com/reference/android/content/SharedPreferences.html ):

รับทั้งหมด

เพิ่มใน API ระดับ 1 แผนที่ getAll () ดึงค่าทั้งหมดจากค่ากำหนด

โปรดทราบว่าคุณต้องไม่แก้ไขคอลเล็กชันที่ส่งคืนโดยวิธีนี้หรือแก้ไขเนื้อหาใด ๆ ไม่รับประกันความสอดคล้องของข้อมูลที่จัดเก็บไว้หากคุณทำ

Returns Map ส่งคืนแผนที่ที่มีรายการคู่คีย์ / ค่าที่แสดงถึงการกำหนดลักษณะ


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, ,floatboolean


-2

ฉันรู้ว่ามันสายไปหน่อย แต่ฉันหวังว่านี่จะเป็นประโยชน์สำหรับทุกคนที่อ่าน ..

ดังนั้นสิ่งที่ฉันทำคือ

1) สร้าง HashMap และเพิ่มข้อมูลเช่น: -

HashMap hashmapobj = new HashMap();
  hashmapobj.put(1001, "I");
  hashmapobj.put(1002, "Love");
  hashmapobj.put(1003, "Java");

2) เขียนลงในตัวแก้ไข shareprefrences เช่น: -

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

แผนที่ไม่ใช่ชุด
Solidogen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.