SharedPreferences極致封裝——可能是全網(wǎng)最簡單的封裝了

起因

sp使用時安卓中必不可少的采章,但是使用麻煩惧笛,幾乎每個人都會二次封裝,但是易用性就不見得了甘磨,話不多說直接上代碼

/**  sp文件存取的封裝處理
 * @Author feisher  on 2017年10月26日09:50:08  更新橡羞,簡化代碼結(jié)構(gòu)
 * Email:458079442@qq.com
 */
public class SPUtils {
    //保存在手機里面的文件名
    public static final String FILE_NAME = "cache";
    public static SharedPreferences sp ;

    private static SharedPreferences init(Context context) {
        return sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
    }

    /**
     *  存
     * @param key 鍵
     * @param value 值
     * @param <E> 泛型,自動根據(jù)值進行處理
     */
    public static <E>void put(@NonNull String key,@NonNull E value) {
        put(MyApplication.getContext(),key,value);
    }

    /**
     *  取
     * @param key 鍵
     * @param defaultValue 默認(rèn)值
     * @param <E> 泛型济舆,自動根據(jù)值進行處理
     * @return
     */
    public static <E>E get(@NonNull String key,@NonNull E defaultValue) {
        return get(MyApplication.getContext(),key,defaultValue);
    }

    /**
     * 插件間和宿主共用數(shù)據(jù) 必須 傳入context
     * @param context
     * @param key
     * @param value
     * @return
     */
    public static <E>void put(Context context,@NonNull String key,@NonNull E value) {
        SharedPreferences.Editor editor = init(context).edit();
        if (value instanceof String||value instanceof Integer||value instanceof Boolean||
                value instanceof Float|| value instanceof Long||value instanceof Double) {
            editor.putString(key, String.valueOf(value));
        }else {
            editor.putString(key, new Gson().toJson(value));
        }
        SPCompat.apply(editor);
    }



    /**
     *插件間和宿主共用數(shù)據(jù) 必須 傳入context
     * @param key
     * @param defaultValue
     * @return
     */
    public static <E>E get(Context context,@NonNull String key,@NonNull E defaultValue) {
        String value = init(context).getString(key, String.valueOf(defaultValue));
        if (defaultValue instanceof String){
            return (E) value;
        }if (defaultValue instanceof Integer){
            return (E) Integer.valueOf(value);
        }if (defaultValue instanceof Boolean){
            return (E) Boolean.valueOf(value);
        }if (defaultValue instanceof Float){
            return (E) Float.valueOf(value);
        }if (defaultValue instanceof Long){
            return (E) Long.valueOf(value);
        }if (defaultValue instanceof Double){
            return (E) Double.valueOf(value);
        }
        //json為null的時候返回對象為null,gson已處理
        return (E) new Gson().fromJson(value,defaultValue.getClass());
    }


    /**
     * 移除某個key值已經(jīng)對應(yīng)的值
     * @param context
     * @param key
     */
    public static void remove(Context context, String key) {
        SharedPreferences.Editor editor = init(context).edit();
        editor.remove(key);
        SPCompat.apply(editor);
    }

    /**
     * 清除所有數(shù)據(jù)
     * @param context
     */
    public static void clear(Context context) {
        SharedPreferences.Editor editor = init(context).edit();
        editor.clear();
        SPCompat.apply(editor);
    }

    /**
     * 查詢某個key是否已經(jīng)存在
     *
     * @param context
     * @param key
     * @return
     */
    public static boolean contains(Context context, String key) {
        return init(context).contains(key);
    }
    public static boolean contains(String key) {
        return contains(MyApplication.getContext(),key);
    }

    /**
     * 返回所有的鍵值對
     *
     * @param context
     * @return
     */
    public static Map<String, ?> getAll(Context context) {
        return init(context).getAll();
    }

    /**
     * 保存對象到sp文件中 被保存的對象須要實現(xiàn) Serializable 接口
     * @param key
     * @param value
     */
    public static void saveObject( String key, Object value) {
        put(key,value);
    }

    /**
     * desc:獲取保存的Object對象
     * @param key
     * @return modified:
     */
    public static <T>T readObject(String key,  Class<T> clazz) {
        try {
            return (T) get(key,clazz.newInstance());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 創(chuàng)建一個解決SharedPreferencesCompat.apply方法的一個兼容類
     * @author
     */
    private static class SPCompat {
        private static final Method S_APPLY_METHOD = findApplyMethod();

        /**
         * 反射查找apply的方法
         * @return
         */
        @SuppressWarnings({"unchecked", "rawtypes"})
        private static Method findApplyMethod() {
            try {
                Class clz = SharedPreferences.Editor.class;
                return clz.getMethod("apply");
            } catch (NoSuchMethodException e) {
            }
            return null;
        }

        /**
         * 如果找到則使用apply執(zhí)行卿泽,否則使用commit
         * @param editor
         */
        public static void apply(SharedPreferences.Editor editor) {
            try {
                if (S_APPLY_METHOD != null) {
                    S_APPLY_METHOD.invoke(editor);
                    return;
                }
            } catch (Exception e) {
            }
            editor.commit();
        }
    }
}
package com.feisher.utils;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;
import com.google.gson.Gson;
import com.yusong.community.MyApplication;
import java.lang.reflect.Method;
import java.util.Map;

/**  sp文件存取的封裝處理
 * @Author feisher  on 2017/10/17 9:47 修改
 * Email:458079442@qq.com
 */
public class SPUtils {
    //保存在手機里面的文件名
    public static final String FILE_NAME = "cache";
    public static SharedPreferences sp =                   MyApplication.getContext().getSharedPreferences(FILE_NAME,
            Context.MODE_PRIVATE);

    /**  存入數(shù)據(jù)
     * @param key
     * @param value
     * @return
     */
    public static <E>void put(@NonNull String key,@NonNull E value) {
        SharedPreferences.Editor editor = sp.edit();
        if (value instanceof String||value instanceof Integer||value instanceof Boolean||
                value instanceof Float|| value instanceof Long||value instanceof Double) {
            editor.putString(key,  String.valueOf(value));
        }else {
            editor.putString(key, new Gson().toJson(value));
        }
        SPCompat.apply(editor);
    }
    /**
     * 得到保存數(shù)據(jù)的方法
     * @return
     */
    public static <E>E get(@NonNull String key,@NonNull E defaultValue) {

        String value = sp.getString(key, String.valueOf(defaultValue));
        if (defaultValue instanceof String){
            return (E) value;
        }if (defaultValue instanceof Integer){
            return (E) Integer.valueOf(value);
        }if (defaultValue instanceof Boolean){
            return (E) Boolean.valueOf(value);
        }if (defaultValue instanceof Float){
            return (E) Float.valueOf(value);
        }if (defaultValue instanceof Long){
            return (E) Long.valueOf(value);
        }if (defaultValue instanceof Double){
            return (E) Double.valueOf(value);
        }
        //json為null的時候返回對象為null,gson已處理
        return (E) new Gson().fromJson(sp.getString(key, null),defaultValue.getClass());
    }

    /**
     * 插件間和宿主共用數(shù)據(jù) 必須 傳入context
     * @param context
     * @param key
     * @param value
     * @return
     */
    public static <E>void put(Context context,@NonNull String key,@NonNull E value) {
        sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        if (value instanceof String||value instanceof Integer||value instanceof Boolean||
                value instanceof Float|| value instanceof Long||value instanceof Double) {
            editor.putString(key, String.valueOf(value));
        }else {
            editor.putString(key, new Gson().toJson(value));
        }
        SPCompat.apply(editor);
    }

    /**
     *插件間和宿主共用數(shù)據(jù) 必須 傳入context
     * @param key
     * @param defaultValue
     * @return
     */
    public static <E>E get(Context context,@NonNull String key,@NonNull E defaultValue) {
        sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        if (defaultValue instanceof String||defaultValue instanceof Integer||
                defaultValue instanceof Boolean|| defaultValue instanceof Float||
                defaultValue instanceof Long||defaultValue instanceof Double) {
            return (E) sp.getString(key, String.valueOf(defaultValue));
        }
        //json為null的時候返回對象為null,gson已處理
        return (E) new Gson().fromJson(sp.getString(key, null),defaultValue.getClass());
    }


    /**
     * 移除某個key值已經(jīng)對應(yīng)的值
     * @param context
     * @param key
     */
    public static void remove(Context context, String key) {
        SharedPreferences.Editor editor = sp.edit();
        editor.remove(key);
        SPCompat.apply(editor);
    }

    /**
     * 清除所有數(shù)據(jù)
     * @param context
     */
    public static void clear(Context context) {
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        SPCompat.apply(editor);
    }

    /**
     * 查詢某個key是否已經(jīng)存在
     *
     * @param context
     * @param key
     * @return
     */
    public static boolean contains(Context context, String key) {
        return sp.contains(key);
    }
    public static boolean contains(String key) {
        return sp.contains(key);
    }

    /**
     * 返回所有的鍵值對
     *
     * @param context
     * @return
     */
    public static Map<String, ?> getAll(Context context) {
        return sp.getAll();
    }

    /**
     * 保存對象到sp文件中 被保存的對象須要實現(xiàn) Serializable 接口
     * @param key
     * @param value
     */
    public static void saveObject( String key, Object value) {
        put(key,value);
    }

    /**
     * desc:獲取保存的Object對象
     * @param key
     * @return modified:
     */
    public static <T>T readObject(String key,  Class<T> clazz) {
        try {
            return (T) get(key,clazz.newInstance());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 創(chuàng)建一個解決SharedPreferencesCompat.apply方法的一個兼容類
     * @author
     */
    private static class SPCompat {
        private static final Method S_APPLY_METHOD = findApplyMethod();

        /**
         * 反射查找apply的方法
         * @return
         */
        @SuppressWarnings({"unchecked", "rawtypes"})
        private static Method findApplyMethod() {
            try {
                Class clz = SharedPreferences.Editor.class;
                return clz.getMethod("apply");
            } catch (NoSuchMethodException e) {
            }
            return null;
        }

        /**
         * 如果找到則使用apply執(zhí)行,否則使用commit
         * @param editor
         */
        public static void apply(SharedPreferences.Editor editor) {
            try {
                if (S_APPLY_METHOD != null) {
                    S_APPLY_METHOD.invoke(editor);
                    return;
                }
            } catch (Exception e) {
            }
            editor.commit();
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滋觉,一起剝皮案震驚了整個濱河市签夭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椎侠,老刑警劉巖第租,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肺蔚,居然都是意外死亡煌妈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門宣羊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來璧诵,“玉大人,你說我怎么就攤上這事仇冯≈蓿” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵苛坚,是天一觀的道長比被。 經(jīng)常有香客問我,道長泼舱,這世上最難降的妖魔是什么等缀? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮娇昙,結(jié)果婚禮上尺迂,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好噪裕,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布蹲盘。 她就那樣靜靜地躺著,像睡著了一般膳音。 火紅的嫁衣襯著肌膚如雪召衔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天祭陷,我揣著相機與錄音苍凛,去河邊找鬼。 笑死兵志,一個胖子當(dāng)著我的面吹牛毫深,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毒姨,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼哑蔫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弧呐?” 一聲冷哼從身側(cè)響起闸迷,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俘枫,沒想到半個月后腥沽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鸠蚪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年今阳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茅信。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡盾舌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蘸鲸,到底是詐尸還是另有隱情妖谴,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布酌摇,位于F島的核電站膝舅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窑多。R本人自食惡果不足惜仍稀,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埂息。 院中可真熱鬧技潘,春花似錦判沟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吧秕。三九已至琉闪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砸彬,已是汗流浹背颠毙。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砂碉,地道東北人蛀蜜。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像增蹭,于是被迫代替她去往敵國和親滴某。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容