HashMap을 공유 기본 설정에 저장하는 방법은 무엇입니까?


답변:


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 2012

5
다음은 ObjectOutputStream과 ObjectInputStream을 함께 사용하는 방법의 예입니다. tutorialspoint.com/java/io/objectinputstream_readobject.htm
Krzysztof Skrzynecki

Hashmap이 복잡한 객체 일 때부터? 이것을 어떻게 가정 했습니까?
Pedro Paulo Amorim

78

내가 사용하는 Gson변환에 HashMapString그것을 저장에 다음과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
gson에서 해시 맵을 얻는 방법 com.qb.gson.JsonSyntaxException : java.lang.IllegalStateException : 예상 BEGIN_OBJECT하지만 BEGIN_ARRAY가 1 행 2 열 –
Ram

BEGIN_OBJECT를 예상했지만 BEGIN_ARRAY가 발생했습니다. HashMap <String, String>은 HashMap <String, Object> 여야하기 때문입니다. 값이 항상 String 개체이면 문제가 없지만 일부 키의 값이 diff이면 String (예 : 사용자 정의 객체 또는 목록 또는 배열) 예외가 발생합니다. 그래서 당신의 HashMap <문자열, 개체> 필요 다시 모든 것을 분석 할 수 있어야합니다
Stoycho 안드리

44

기본 설정에서지도를 저장하고 기본 설정에서지도를로드하는 간단한 코드를 작성했습니다. 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;
}

완벽한 해답 :
Ramkesh 야다 브

getApplicationContext간단한 수업에서 어떻게 액세스 할 수 있습니까?
Dmitry

@Dmitry A는 바로 가기 : 당신의 간단한 클래스에서 설정 상황에 맞는 방법을 포함하고 멤버 변수로 상황을 설정하고 그에 따라 그것을 사용
Vinoj 존 호산

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 2011 년

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

공유 환경 설정 전용 파일 (출처 : https://developer.android.com/reference/android/content/SharedPreferences.html ) 에서 사용할 수 있습니다 .

모든 것을 가져라

API 레벨 1에 추가됨 Map getAll () 환경 설정에서 모든 값을 검색합니다.

이 메서드에서 반환 된 컬렉션을 수정하거나 그 내용을 변경해서는 안됩니다. 그렇게하면 저장된 데이터의 일관성이 보장되지 않습니다.

맵 반환 기본 설정을 나타내는 키 / 값 쌍 목록이 포함 된 맵을 반환합니다.


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, float, boolean.


-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.