操作SharedPreferences遇到的问题

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值