Làm cách nào để lưu HashMap vào Shared Preferences?


Câu trả lời:


84

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

6
Với một ObjectInputStream.
Kirill Rakhman

5
đây là một ví dụ làm thế nào để sử dụng ObjectOutputStream và ObjectInputStream với nhau: tutorialspoint.com/java/io/objectinputstream_readobject.htm
Krzysztof Skrzynecki

Từ khi nào Hashmap là một đối tượng phức tạp? Làm thế nào bạn cho rằng điều này?
Pedro Paulo Amorim

78

Tôi sử dụng Gsonđể chuyển đổi HashMapsang Stringvà 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();
}

2
cách lấy hashmap từ gson. Tôi gặp lỗi msg như com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: Dự kiến ​​là BEGIN_OBJECT nhưng bị BEGIN_ARRAY ở dòng 1 cột 2 -
Ram

Dự kiến ​​BEGIN_OBJECT nhưng là BEGIN_ARRAY đang xảy ra vì HashMap <String, String> phải là HashMap <String, Object>, nếu các giá trị luôn là đối tượng String, bạn sẽ không gặp bất kỳ vấn đề gì nhưng nếu giá trị của một số khóa khác thì String (ví dụ đối tượng tùy chỉnh, hoặc danh sách hoặc mảng) thì ngoại lệ sẽ được ném ra. Vì vậy, để có thể phân tích lại tất cả mọi thứ bạn cần HashMap <String, Object>
Stoycho Andreev

43

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

câu trả lời hoàn hảo :)
Ramkesh Yadav

Làm cách nào để truy cập getApplicationContexttừ một lớp đơn giản?
Dmitry

@Dmitry Một phím tắt: Trong lớp đơn giản của bạn, bao gồm phương pháp bối cảnh bộ và thiết lập bối cảnh như biến thành viên và sử dụng nó cho phù hợp
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();

nhưng tôi cần phải lưu bản đồ băm như bản thân như chúng tôi thêm vector vào sở thích chia sẻ
jibysthomas

hơn là bạn có thể phải sử dụng tuần tự hóa và lưu HashMap được tuần tự hóa trong SharedPrefs. Bạn có thể dễ dàng tìm thấy các ví dụ mã về cách làm điều đó.
hovanessyan

11

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, MyAppApplicationlớ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;
}

Làm cách nào để truy cập MyApp từ thư viện?
Dmitry

@Dmitry Bạn sẽ làm điều này giống như cách bạn truy cập Contextphiê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?
Kyle Falconer

2

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

1
String converted = new Gson().toJson(map);
SharedPreferences sharedPreferences = getSharedPreferences("sharepref",Context.MODE_PRIVATE);
sharedPreferences.edit().putString("yourkey",converted).commit();

1
Làm thế nào để đưa nó trở lại Bản đồ?
زياد

1

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

1

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)

0

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.


0

Cách lười biếng: lưu trữ từng khóa trực tiếp trong SharedPreferences

Đố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ó:

Lưu trữ bả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());
}

Đọc các phím từ bản đồ

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.


0

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.