检索hashmap数据SharedPreferences

时间:2017-10-12 05:27:05

标签: java android sharedpreferences

我使用HashMap来存储我使用API​​收到的数据。之后,我使用SharedPreferences存储收到的HashMap数据。存储部分已完成。我可以看到我想使用SharedPreferences存储的记录数。

以下是保存数据的代码:

if (result != null && result.length() > 0)
{
    for (int j = 0; j < result.length(); j++)
    {
       JSONObject resultObj = result.getJSONObject(j);
       String label_id = resultObj.getString("label_id");
       String arabic = resultObj.getString("arabic");
       String english = resultObj.getString("english");
       String key = resultObj.getString("key");

       //Create a new model and set the received value
       LabelModel labelModel = new LabelModel();
       labelModel.setLabelId(label_id);
       labelModel.setArabic(arabic);
       labelModel.setEnglish(english);
       labelModel.setKey(key);

       int label = Integer.parseInt(label_id);
       //Put the value

       map.put(label, labelModel);
     }
}

//With the below line, I stored the hashMap data using SharedPreferences
Pref.setValue(mActivity, AppPrefrences.PREF_LABELS, map);

完成上述步骤后,我按照这组代码将设置获取来自SharePreferences的值,我使用SharedPreferences存储在应用程序中。 为此,我使用了以下代码:

public static String PREF_LABELS ="labels";

 public static void setValue(@NonNull Context context, String key, Object obj) {
    Pref.openPref(context);
    Editor prefsPrivateEditor = Pref.sharedPreferences.edit();
    prefsPrivateEditor.putString(key, String.valueOf(obj));
    prefsPrivateEditor.commit();
    prefsPrivateEditor = null;
    Pref.sharedPreferences = null;
}

@Nullable
public static String getValue(@NonNull Context context, String key, Object obj) {
    Pref.openPref(context);
    String result = Pref.sharedPreferences.getString(key, String.valueOf(obj));
    Pref.sharedPreferences = null;
    return result;
}

现在,我正在尝试检索存储在SharedPreferences中的数据。 这是我用来检索数据的代码:

String labels = Pref.getValue(mActivity, AppPrefrences.PREF_LABELS, "");

当我调试应用时,我会在格式下面的标签中获得值。我收到的记录数量相同。

格式如下:

{572=com.*****.landlord.model.LabelModel@23a282e, 598=com.*****.landlord.model.LabelModel@c954fcf, 590=com.*****.landlord.model.LabelModel@2fe3d5c, 103=com.*****..........}

如何从这种格式中获取每个数据?

5 个答案:

答案 0 :(得分:2)

SharedPreferences中不支持HashMap。因此,您无法通过直接将HashMap转换为字符串来保存HashMap,但您可以将其转换为JSON字符串。在这种情况下,您可以使用google-gson。像这样:

首先,包括依赖项:

compile 'com.google.code.gson:gson:2.8.2'

从HashMap对象保存到首选项:

Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(map);
prefsEditor.putString("YourHashMap", json);
prefsEditor.commit();

从首选项中获取HashMap对象:

Gson gson = new Gson();
String json = mPrefs.getString("YourHashMap", "");
HashMap map = gson.fromJson(json, HashMap.class);

答案 1 :(得分:1)

您收到{572=com.*****.landlord.model.LabelModel@23a282e, 598=com.*****.landlord.model.LabelModel@c954fcf, 590=com.*****.landlord.model.LabelModel@2fe3d5c, 103=com.*****..........}这是因为对象默认toString()方法使用hashcode

不建议在 SharedPreference 中存储复杂对象。 SharedPreference不支持 HashMap link

要存储简单对象,您必须使用toString()方法将对象转换为字符串。 您可以使用Gson将对象转换为String,这将是一个简单的解决方案。

您也可以使用ObjectOutputStream将其写入内部存储器check this link

答案 2 :(得分:1)

你应该将lables字符串转换为hashmap对象这是一个解决方案。如果你想让它更通用,你可以使用StringUtils库。

String value = "{first_name = mohit,last_name = mathur,gender = male}";
value = value.substring(1, value.length()-1);           //remove curly brackets
String[] keyValuePairs = value.split(",");              //split the string to creat key-value pairs
Map<String,String> map = new HashMap<>();               

for(String pair : keyValuePairs)                        //iterate over the pairs
{
    String[] entry = pair.split("=");                   //split the pairs to get key and value 
    map.put(entry[0].trim(), entry[1].trim());          //add them to the hashmap and trim whitespaces
}

例如,您可以切换

value = value.substring(1, value.length()-1);

value = StringUtils.substringBetween(value, "{", "}");

之后

您应该在LabelModel中转换值 喜欢

LabelModel labels = map.get("598");

答案 3 :(得分:1)

而是将地图转换为gson String并将其存储在首选项中,如此

   //convert to string using gson
    Gson gson = new Gson();
    String mapString = gson.toJson(map);

    //save this in the shared prefs
    SharedPreferences prefs = getSharedPreferences("test", MODE_PRIVATE);
    prefs.edit().putString("yourkey", mapString).apply();

    //get from shared prefs in gson and convert to maps again
    String storedHashMapString = prefs.getString("yourkey",null);
    java.lang.reflect.Type type = new TypeToken<HashMap<String, String>>(){}.getType();

      //Get the hashMap
    HashMap<String, String> map = gson.fromJson(storedHashMapString, type);

答案 4 :(得分:0)

SharedPreference不支持商店地图对象。 https://developer.android.com/reference/android/content/SharedPreferences.Editor.html。所以你的代码只存储数据obj.toString,这就是你在调试中看到结果的原因。如果要存储地图,可以存储为json并使用put string。