Làm cách nào để lưu HashMap vào Tùy chọn chia sẻ trong Android?
Làm cách nào để lưu HashMap vào Tùy chọn chia sẻ trong Android?
Câu trả lời:
Tôi không khuyên bạn nên viết các đối tượng phức tạp vào SharedPreference. Thay vào đó, tôi sẽ sử dụng ObjectOutputStream
để ghi nó vào bộ nhớ trong.
File file = new File(getDir("data", MODE_PRIVATE), "map");
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(map);
outputStream.flush();
outputStream.close();
Tôi sử dụng Gson
để chuyển đổi HashMap
sang String
và sau đó lưu nó vàoSharedPrefs
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();
}
Tôi đã viết một đoạn mã đơn giản để lưu bản đồ theo sở thích và tải bản đồ theo sở thích. Không yêu cầu chức năng GSON hoặc Jackson. Tôi vừa sử dụng một bản đồ có String làm khóa và Boolean là một giá trị.
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
từ một lớp đơn giản?
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();
Như một sự thay đổi từ câu trả lời của Vinoj John Hosan, tôi đã sửa đổi câu trả lời để cho phép chèn chung chung hơn, dựa trên khóa của dữ liệu, thay vì một khóa như "My_map"
.
Trong triển khai của tôi, MyApp
là Application
lớp ghi đè của tôi và MyApp.getInstance()
hành động để trả về 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
phiên bản từ thư viện. Kiểm tra câu hỏi SO khác này: Có thể lấy ngữ cảnh của ứng dụng trong Dự án thư viện Android không?
Bạn có thể thử sử dụng JSON để thay thế.
Để tiết kiệm
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
}
Để nhận được
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();
Sử dụng PowerPreference .
Lưu dữ liệu
HashMap<String, Object> hashMap = new HashMap<String, Object>();
PowerPreference.getDefaultFile().put("key",hashMap);
Đọc dữ liệu
HashMap<String, Object> value = PowerPreference.getDefaultFile().getMap("key", HashMap.class, String.class, Object.class);
bản đồ -> chuỗi
val jsonString: String = Gson().toJson(map)
preferences.edit().putString("KEY_MAP_SAVE", jsonString).apply()
string -> map
val jsonString: String = preferences.getString("KEY_MAP_SAVE", JSONObject().toString())
val listType = object : TypeToken<Map<String, String>>() {}.type
return Gson().fromJson(jsonString, listType)
Bạn có thể sử dụng điều này trong một tệp prefs chuyên dụng được chia sẻ (nguồn: https://developer.android.com/reference/android/content/SharedPreferences.html ):
lấy tất cả
được thêm vào API cấp 1 Bản đồ getAll () Lấy tất cả các giá trị từ các tùy chọn.
Lưu ý rằng bạn không được sửa đổi bộ sưu tập được trả về bằng phương thức này hoặc thay đổi bất kỳ nội dung nào của nó. Tính nhất quán của dữ liệu được lưu trữ của bạn không được đảm bảo nếu bạn làm như vậy.
Trả về bản đồ Trả về một bản đồ chứa danh sách các cặp khóa / giá trị đại diện cho các tùy chọn.
Đối với trường hợp sử dụng hẹp khi bản đồ của bạn chỉ có không quá vài chục phần tử, bạn có thể tận dụng lợi thế của thực tế là SharedPreferences hoạt động khá giống một bản đồ và chỉ cần lưu trữ từng mục nhập dưới khóa riêng của nó:
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");
Trong trường hợp bạn sử dụng tên tùy chọn tùy chỉnh (tức là context.getSharedPreferences("myMegaMap")
), bạn cũng có thể nhận được tất cả các khóa vớiprefs.getAll()
Giá trị của bạn có thể là bất kỳ loại hỗ trợ bởi SharedPreferences:
String
,int
,long
,float
,boolean
.
Tôi biết nó hơi muộn nhưng tôi hy vọng điều này có thể hữu ích cho bất kỳ ai đang đọc ..
vì vậy những gì tôi làm là
1) Tạo HashMap và thêm dữ liệu như: -
HashMap hashmapobj = new HashMap();
hashmapobj.put(1001, "I");
hashmapobj.put(1002, "Love");
hashmapobj.put(1003, "Java");
2) Viết nó lên trình chỉnh sửa shareprefrences như: -
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) Đọc dữ liệu như: - trong một lớp mới mà bạn muốn nó được đọc
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);