Android의 공유 기본 설정 에 HashMap 을 어떻게 저장할 수 있습니까?
Android의 공유 기본 설정 에 HashMap 을 어떻게 저장할 수 있습니까?
답변:
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을 키로 사용하고 Boolean을 값으로 사용하는 맵을 사용했습니다.
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)
공유 환경 설정 전용 파일 (출처 : https://developer.android.com/reference/android/content/SharedPreferences.html ) 에서 사용할 수 있습니다 .
모든 것을 가져라
API 레벨 1에 추가됨 Map getAll () 환경 설정에서 모든 값을 검색합니다.
이 메서드에서 반환 된 컬렉션을 수정하거나 그 내용을 변경해서는 안됩니다. 그렇게하면 저장된 데이터의 일관성이 보장되지 않습니다.
맵 반환 기본 설정을 나타내는 키 / 값 쌍 목록이 포함 된 맵을 반환합니다.
맵에 수십 개 이하의 요소 만 포함되는 좁은 사용 사례의 경우 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);