2011-10-30 23 views

Trả lời

69

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

Làm thế nào tôi có thể đọc được 'HashMap' này sau? – Roman

+5

Với một ObjectInputStream. –

+1

Câu trả lời này hữu ích nhất! – mxg

29
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(); 
+0

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

+0

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

41

tôi sử dụng để chuyển đổi GsonHashMap để String và sau đó lưu nó vào 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(); 
} 
+3

Nhưng làm thế nào chúng ta có thể làm điều đó? Bất kỳ mẫu mã nào? –

+0

cách lấy hashmap từ gson tôi nhận được thông báo lỗi như com.qb.gson.JsonSyntaxException: java.lang.IllegalStateException: Dự kiến ​​BEGIN_OBJECT nhưng đã BEGIN_ARRAY ở dòng 1 cột 2 - – Ram

+0

@Ram Tôi đã thêm mã. Có lẽ nó sẽ giúp – penduDev

31

Tôi đã viết một đoạn mã đơn giản để lưu bản đồ trong sở thích và tải các bản đồ từ sở thích. Không yêu cầu chức năng GSON hoặc Jackson. Tôi chỉ sử dụng một bản đồ có String là khóa và Boolean như 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; 
} 
2

Bạn có thể thử sử dụng JSON để thay thế.

Đối với 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(); 
} 
6

Là một spin off của câu trả lời Vinoj John Hosan, tôi sửa đổi câu trả lời để cho phép chèn chung chung hơn, căn cứ vào quan trọng của dữ liệu , thay vì một phím duy nhất như "My_map".

Khi triển khai, MyApp là lớp ghi đè ApplicationMyApp.getInstance() hoạt động để trả lại 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; 
} 
0

Bạn có thể sử dụng điều này trong một chuyên dụng trên prefs chia sẻ tập tin (nguồn: https://developer.android.com/reference/android/content/SharedPreferences.html):

GetAll

thêm vào mức API 1 Bản đồ GetAll() Lấy tất cả các giá trị từ sự sở thích.

Lưu ý rằng bạn không được sửa đổi bộ sưu tập được trả về theo phương pháp 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 là không được đảm bảo nếu bạn thực hiện.

Trả về bản đồ Trả về bản đồ có chứa danh sách các cặp khóa/giá trị đại diện cho các tùy chọn.

Các vấn đề liên quan