ฉันจะบันทึกHashMapเป็นShared Preferencesใน Android ได้อย่างไร
ฉันจะบันทึกHashMapเป็นShared Preferencesใน Android ได้อย่างไร
คำตอบ:
ฉันไม่แนะนำให้เขียนวัตถุที่ซับซ้อนลงใน 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 หรือ 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;
}
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();
ในการแยกคำตอบของ 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;
}
Context
อินสแตนซ์จากไลบรารี ลองดูคำถาม SO อื่น ๆ นี้: เป็นไปได้ไหมที่จะรับบริบทของแอปพลิเคชันในโครงการห้องสมุด Android
คุณสามารถลองใช้ 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();
แผนที่ -> สตริง
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)
คุณสามารถใช้สิ่งนี้ในไฟล์ prefs ที่แชร์โดยเฉพาะ (ที่มา: https://developer.android.com/reference/android/content/SharedPreferences.html ):
รับทั้งหมด
เพิ่มใน API ระดับ 1 แผนที่ getAll () ดึงค่าทั้งหมดจากค่ากำหนด
โปรดทราบว่าคุณต้องไม่แก้ไขคอลเล็กชันที่ส่งคืนโดยวิธีนี้หรือแก้ไขเนื้อหาใด ๆ ไม่รับประกันความสอดคล้องของข้อมูลที่จัดเก็บไว้หากคุณทำ
Returns Map ส่งคืนแผนที่ที่มีรายการคู่คีย์ / ค่าที่แสดงถึงการกำหนดลักษณะ
สำหรับกรณีการใช้งานที่แคบเมื่อแผนที่ของคุณมีองค์ประกอบไม่เกินสองสามองค์ประกอบคุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่า 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 และเพิ่มข้อมูลเช่น: -
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);