如何使用键作为共享首选对象来保存hashmap

时间:2015-06-22 12:39:53

标签: android hashmap sharedpreferences classcastexception

我想将一些对象设置为hashmap的键。我需要将此hashmap保存到共享首选项。以下是我的代码。

  public void saveDetailsMap(MyModel model, int type) {
    HashMap<NVRModel, Integer> ipMap = getAddressMap();
    ipMap.put(nvrModel, type);
    JSONObject jsonObject = new JSONObject(ipMap);
    String jsonString = jsonObject.toString();
    settings.edit().putString(MAP, jsonString).commit();
}

public HashMap<MyModel, Integer> getAddressMap() {
    HashMap<MyModel, Integer> ipMap = new HashMap<MyModel, Integer>();
    try {

        String jsonString = settings.getString(MAP,
                (new JSONObject()).toString());
        JSONObject jsonObject = new JSONObject(jsonString);
        Iterator keysItr = jsonObject.keys();
        while (keysItr.hasNext()) {
            MyModel key = (MyModel)keysItr.next();
            Integer value = (Integer) jsonObject.get(key.toString());
            ipMap.put(key, value);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return ipMap;
}

但我得到了这个例外

 java.lang.ClassCastException: com.model.MyModel cannot be cast to java.lang.String

在下面一行。

JSONObject jsonObject = new JSONObject(ipMap);

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

hasmap必须是String类型才能是valide。其他你不能保存它,这是造成错误的原因。 你可以做的是使用一个文件来保存你的数据使用ObjectOutputStream。

File file = new File(getDir("data", MODE_PRIVATE), "map");    
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(map);
outputStream.flush();
outputStream.close();

答案 1 :(得分:0)

javascript对象的键必须是String类型。因此,您不能使用HashMap<NVRModel, Integer> ipMap作为JSONObject的构造函数参数。