SharedPreferences 缓存工具类SPUtil

1. 使用support包中SharedPreferencesCompat.apply()方法存储数据,解决apply()在低版本sdk兼容问题

2. 支持针对用户存储,只需修改 SharedPreferences 文件名即可

public class SPUtil {

    public static final String KEY_USER_HOBBY_DIALOG = "key_user_hobby_dialog";//用户兴趣对话框

    // @Retention 定义策略
    // 声明构造器
    @StringDef({KEY_USER_HOBBY_DIALOG,})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SPKey {
    }


    private static final String USER_SP_PREFIX = "SP_USER_";
    public static String userTemp = "userTemp";


    /**
     * 获取 SharedPreferences
     *
     * @param inUserSP 是否跟用户相关
     * @return SharedPreferences
     */
    private static SharedPreferences getSharedPreferences(boolean inUserSP) {
        SharedPreferences sharedPreferences;
        if (inUserSP) {
            String name = USER_SP_PREFIX + userTemp;
            sharedPreferences = AppContext.getInstance().getApplicationContext().getSharedPreferences(name, Context.MODE_PRIVATE);
        } else {
            sharedPreferences = PreferenceManager.getDefaultSharedPreferences(AppContext.getInstance().getApplicationContext());
        }
        return sharedPreferences;
    }


    /**
     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
     *
     * @param key    key
     * @param object value
     */

    public static void putDefaultSP(@SPKey String key, Object object) {
        put(false, key, object);
    }

    /**
     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
     *
     * @param key    key
     * @param object value
     */
    @SuppressLint("CommitPrefEdits")
    public static void putUserSP(@SPKey String key, Object object) {
        put(true, key, object);
    }

    /**
     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
     *
     * @param inUserSP 是否保存在与用户相关的 SharedPreferences
     * @param key      key
     * @param object   value
     */
    @SuppressLint("CommitPrefEdits")
    private static void put(boolean inUserSP, @SPKey String key, Object object) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        SharedPreferences.Editor editor = sp.edit();

        if (object instanceof String) {
            editor.putString(key, (String) object);
        } else if (object instanceof Integer) {
            editor.putInt(key, (Integer) object);
        } else if (object instanceof Boolean) {
            editor.putBoolean(key, (Boolean) object);
        } else if (object instanceof Float) {
            editor.putFloat(key, (Float) object);
        } else if (object instanceof Long) {
            editor.putLong(key, (Long) object);
        } else {
            editor.putString(key, object.toString());
        }
        SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
    }


    public static Object getFromDefaultSP(@SPKey String key, Object defaultObject) {
        return get(false, key, defaultObject);
    }

    public static Object getFromUserSP(@SPKey String key, Object defaultObject) {
        return get(true, key, defaultObject);
    }

    /**
     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
     *
     * @param inUserSP      是否从 跟用户相关的SharedPreferences中 取值
     * @param key           key
     * @param defaultObject defaultObject
     * @return Object
     */
    private static Object get(boolean inUserSP, @SPKey String key, Object defaultObject) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        if (defaultObject instanceof String) {
            return sp.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return sp.getInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return sp.getFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return sp.getLong(key, (Long) defaultObject);
        }
        return null;
    }

    public static String getFromDefaultSP(@SPKey String key, String defValue) {
        return get(false, key, defValue);
    }

    public static String getFromUserSP(@SPKey String key, String defValue) {
        return get(true, key, defValue);
    }

    private static String get(boolean inUserSP, @SPKey String key, String defValue) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        return sp.getString(key, defValue);
    }


    /*****************************  boolean  begin***************************/
    public static boolean getFromDefaultSP(@SPKey String key, boolean defValue) {
        return get(false, key, defValue);
    }

    public static boolean getFromUserSP(@SPKey String key, boolean defValue) {
        return get(true, key, defValue);
    }

    private static boolean get(boolean inUserSP, @SPKey String key, boolean defValue) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        return sp.getBoolean(key, defValue);
    }
    /*****************************  boolean  end***************************/


    /*****************************  int  begin***************************/
    public static int getFromDefaultSP(@SPKey String key, int defValue) {
        return get(false, key, defValue);
    }

    public static int getFromUserSP(@SPKey String key, int defValue) {
        return get(true, key, defValue);
    }

    private static int get(boolean inUserSP, @SPKey String key, int defValue) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        return sp.getInt(key, defValue);
    }
    /*****************************  int  end***************************/


    /*****************************  float  begin***************************/
    public static float getFromDefaultSP(String key, float defValue) {
        return  get(false, key, defValue);
    }

    public static float getFromUserSP(@SPKey String key, float defValue) {
        return get(true, key, defValue);
    }

    private static float get(boolean inUserSP, @SPKey String key, float defValue) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        return sp.getFloat(key, defValue);
    }
    /*****************************  float  end***************************/


    /*****************************  long  begin***************************/
    public static long getFromDefaultSP(@SPKey String key, long defValue) {
        return get(false, key, defValue);
    }

    public static long getFromUserSP(@SPKey String key, long defValue) {
        return get(true, key, defValue);
    }

    private static long get(boolean inUserSP, @SPKey String key, long defValue) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        return sp.getLong(key, defValue);
    }
    /*****************************  long  begin***************************/



    public static void removeFromDefaultSP(@SPKey String key) {
        remove(false, key);
    }

    public static void removeFromUserSP(@SPKey String key) {
        remove(true, key);
    }


    /**
     * 移除某个key值已经对应的值
     *
     * @param inUserSP inUserSP
     * @param key      key
     */
    @SuppressLint("CommitPrefEdits")
    private static void remove(boolean inUserSP, @SPKey String key) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        SharedPreferences.Editor editor = sp.edit();
        editor.remove(key);
        SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
    }


    public static void clearDefaultSP() {
        clear(false);
    }

    public static void clearUserSP() {
        clear(true);
    }

    /**
     * 清除所有数据
     *
     * @param inUserSP inUserSPSP
     */
    @SuppressLint("CommitPrefEdits")
    private static void clear(boolean inUserSP) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
    }

    public static boolean containsInDefaultSP(@SPKey String key) {
        return contains(false, key);
    }

    public static boolean containsInUserSP(@SPKey String key) {
        return contains(true, key);
    }

    /**
     * 查询某个key是否已经存在
     *
     * @param inUserSP inUserSP
     * @param key      key
     * @return boolean
     */
    private static boolean contains(boolean inUserSP, @SPKey String key) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        return sp.contains(key);
    }

    public static Map getAllFromDefault() {
        return getAll(false);
    }

    public static Map getAllFromUser() {
        return getAll(true);
    }

    /**
     * 返回所有的键值对
     *
     * @param inUserSP inUserSP
     * @return Map
     */
    private static Map getAll(boolean inUserSP) {
        SharedPreferences sp = getSharedPreferences(inUserSP);
        return sp.getAll();
    }
}


你可能感兴趣的:(SharedPreferences 缓存工具类SPUtil)