java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at android.app.SharedPreferencesImpl.getInt(SharedPreferencesImpl.java:302)
at com.incall.apps.fotatest.utils.SharedPreferenceUtil.getData(SharedPreferenceUtil.java:69)
at com.incall.apps.fotatest.presenter.UpdatePresenter$1.run(UpdatePresenter.java:33)
使用SharedPreferences时,报错string类型的数据不能转换为integer类型的数据,这是由于存储的数据和获取的默认类型不一致,导致不能转换。
下面是我对SharedPreferences的封装:
/**
* 保存数据
*
* @param context context
* @param key key
* @param data data
*/
public static void saveData(Context context, String key, Object data) {
String type = data.getClass().getSimpleName();
SharedPreferences pref = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
Editor editor = pref.edit();
switch (type) {
case "Integer":
editor.putInt(key, (Integer) data);
break;
case "Boolean":
editor.putBoolean(key, (Boolean) data);
break;
case "String":
editor.putString(key, (String) data);
break;
case "Float":
editor.putFloat(key, (Float) data);
break;
case "Long":
editor.putLong(key, (Long) data);
break;
default:
break;
}
editor.apply();
}
/**
* 获取数据
*
* @param context context
* @param key key
* @param defaultValue defaultValue
* @return value in SP
*/
@SuppressWarnings("unchecked")
public static <T> T getData(Context context, String key, T defaultValue) {
SharedPreferences pref = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
if (defaultValue instanceof Integer) {
return (T) (Integer) pref.getInt(key, (Integer) defaultValue);
} else if (defaultValue instanceof Boolean) {
return (T) (Boolean) pref.getBoolean(key, (Boolean) defaultValue);
} else if (defaultValue instanceof String) {
return (T) pref.getString(key, (String) defaultValue);
} else if (defaultValue instanceof Float) {
return (T) (Float) pref.getFloat(key, (Float) defaultValue);
} else if (defaultValue instanceof Long) {
return (T) (Long) pref.getLong(key, (Long) defaultValue);
} else {
return defaultValue;
}
}
存储数据时:从EditView中获取的数据是Editable类型的,所以我直接就使用它的toString方法就存储了
SharedPreferenceUtil.saveData(mContext, SharedPreferenceUtil.TEST_TIMES, editable.toString());
这样就导致报错在我获取数据时:
SharedPreferenceUtil.getData(MyApplication.getContext(), SharedPreferenceUtil.TEST_TIMES, 1);
修改方法如下所示,并且清理数据库,将之前存储的数据清除掉,不然依然会报错:
if ("".equals(editable.toString())) {
return;
}
int testTimes = Integer.parseInt(editable.toString());
SharedPreferenceUtil.saveData(mContext, SharedPreferenceUtil.TEST_TIMES, testTimes);