封裝一個(gè)SharedPreferences工具類

前段時(shí)間封裝了一個(gè)Preference的工具類秀菱,每次寫項(xiàng)目柿菩,都會(huì)或多或少的修改一點(diǎn)戚嗅,漸漸的改成了目前的樣子,覺得暫時(shí)不會(huì)有大的改動(dòng)了枢舶,所以將此分享出來懦胞。

為了不與Android中的Preference接口沖突,我定義了一個(gè)IPreference接口凉泄,并聲明了一些基本的方法躏尉,如下:

    /**
     * 保存一個(gè)數(shù)據(jù)
     */
    <T> void put(String key, T value);

    /**
     * 保存一個(gè)Map集合
     */
    <T> void putAll(Map<String, T> map);

    /**
     * 保存一個(gè)List集合
     */
    void putAll(String key, List<String> list);

    /**
     * 根據(jù)key取出一個(gè)數(shù)據(jù)
     */
    <T> T get(String key, DataType type);

    /**
     * 取出全部數(shù)據(jù)
     */
    Map<String, ?> getAll();

    /**
     * 取出一個(gè)List集合
     */
    List<String> getAll(String key);

    /**
     * 移除一個(gè)數(shù)據(jù)
     */
    void remove(String key);

    /**
     * 移除一個(gè)集合的數(shù)據(jù)
     */
    void removeAll(List<String> keys);

    /**
     * 移除一個(gè)集合的數(shù)據(jù)
     */
    void removeAll(String[] keys);

    /**
     * 是否存在key
     */
    boolean contains(String key);

    /**
     * 清除全部數(shù)據(jù)
     */
    void clear();

除了基本的6種數(shù)據(jù)類型,其中還支持了List集合存儲(chǔ)的String數(shù)據(jù)旧困,當(dāng)然醇份,由于需要存入Set集合(使用的是TreeSet存儲(chǔ)),如果沒有提供比較器(Comparator)吼具,則使用默認(rèn)比較器僚纷。具體實(shí)現(xiàn)如下:

    @Override
    public void putAll(String key, List<String> list, Comparator<String> comparator) {
        Set<String> set = new TreeSet<>(comparator);
        for(String value : list){
            set.add(value);
        }
        preferences.edit().putStringSet(key, set).apply();
    }

</br>
可以根據(jù)key刪除一個(gè)數(shù)據(jù),或一個(gè)集合或數(shù)組的key(List<String> or String[])拗盒。

    @Override
    public void removeAll(List<String> keys) {
        SharedPreferences.Editor edit = preferences.edit();
        for (String k : keys) {
            edit.remove(k);
        }
        edit.apply();
    }

具體的存儲(chǔ)實(shí)現(xiàn)是一個(gè)私有的方法怖竭,實(shí)現(xiàn)如下:

    /**
     * 保存數(shù)據(jù)
     * @param editor
     * @param key
     * @param obj
     */
    @SuppressWarnings("unchecked")
    private void put(SharedPreferences.Editor editor, String key, Object obj) {
        // key 不為null時(shí)再存入,否則不存儲(chǔ)
        if (key != null){
            if (obj instanceof Integer){
                editor.putInt(key, (Integer)obj);
            } else if (obj instanceof Long){
                editor.putLong(key, (Long)obj);
            } else if (obj instanceof Boolean){
                editor.putBoolean(key, (Boolean)obj);
            } else if (obj instanceof Float){
                editor.putFloat(key, (Float) obj);
            } else if (obj instanceof Set){
                editor.putStringSet(key, (Set<String>) obj);
            } else if(obj instanceof String) { 
                editor.putString(key, String.valueOf(obj));
            } 
        }
    }

具體取數(shù)據(jù)的操作如下:

    /**
     * 根據(jù)key和類型取出數(shù)據(jù)
     */
    private Object getValue(String key, DataType type){
        switch (type) {
            case INTEGER:
                return preferences.getInt(key, -1);
            case FLOAT:
                return preferences.getFloat(key, -1f);
            case BOOLEAN:
                return preferences.getBoolean(key, false);
            case LONG:
                return preferences.getLong(key, -1L);
            case STRING:
                return preferences.getString(key, null);
            case STRING_SET:
                return preferences.getStringSet(key, null);
            default:
                return null;
        }
    }

DataType是一個(gè)枚舉類陡蝇,枚舉所有的可存取的數(shù)據(jù)類型

    enum DataType {
        INTEGER, LONG, BOOLEAN, FLOAT, STRING, STRING_SET
    }

</br>

完整代碼

下面是完整的代碼:

    public interface IPreference {

        IPreferenceHolder prefHolder = new IPreferenceHolder();
    
        /**
         * IPreference的持有類
         */
        class IPreferenceHolder {
            /**
             * 獲得一個(gè)新創(chuàng)建的IPreference對(duì)象
             * @param context 上下文對(duì)象
             * @param fileName 文件名
             * @return
             */
            public IPreference newPreference(Context context, String fileName){
                return new PreferenceImpl(context, fileName);
            }
    
            /**
             * 獲取一個(gè)IPreference對(duì)象
             * @param context 上下文對(duì)象
             * @return
             */
            public IPreference getPreference(Context context){
                return PreferenceImpl.getPreference(context);
            }
    
            /**
             * 獲取一個(gè)IPreference對(duì)象
             * @param context 上下文對(duì)象
             * @param fileName 文件名
             * @return
             */
            public IPreference getPreference(Context context, String fileName){
                return PreferenceImpl.getPreference(context, fileName);
            }
        }
    
        /**
         * 保存一個(gè)數(shù)據(jù)
         * @param key 鍵
         * @param value 值
         */
        <T> void put(String key, T value);
    
        /**
         * 保存一個(gè)Map集合
         * @param map
         */
        <T> void putAll(Map<String, T> map);
    
        /**
         * 保存一個(gè)List集合
         * @param key
         * @param list
         */
        void putAll(String key, List<String> list);
    
        /**
         * 保存一個(gè)List集合痊臭,并且自定保存順序
         * @param key
         * @param list
         * @param comparator
         */
        void putAll(String key, List<String> list, Comparator<String> comparator);
    
        /**
         * 根據(jù)key取出一個(gè)數(shù)據(jù)
         * @param key 鍵
         */
        <T> T get(String key, DataType type);
    
        /**
         * 取出全部數(shù)據(jù)
         */
        Map<String, ?> getAll();
    
        /**
         * 取出一個(gè)List集合
         * @param key
         * @return
         */
        List<String> getAll(String key);
    
        /**
         * 移除一個(gè)數(shù)據(jù)
         * @param key
         * @return
         */
        void remove(String key);
    
        /**
         * 移除一個(gè)集合的數(shù)據(jù)
         * @param keys
         * @return
         */
        void removeAll(List<String> keys);
    
        /**
         * 移除一個(gè)集合的數(shù)據(jù)
         * @param keys
         * @return
         */
        void removeAll(String[] keys);
    
        /**
         * 是否存在key
         * @return
         */
        boolean contains(String key);
    
        /**
         * 清除全部數(shù)據(jù)
         */
        void clear();
    
        /**
         * 獲取String類型的數(shù)據(jù)
         * @param key
         * @return
         */
        String getString(String key);
    
        /**
         * 獲取Float類型的數(shù)據(jù)
         * @param key
         * @return
         */
        float getFloat(String key);
    
        /**
         * 獲取int類型的數(shù)據(jù)
         * @return
         */
        int getInteger(String key);
    
        /**
         * 獲取long類型的數(shù)據(jù)
         * @param key
         * @return
         */
        long getLong(String key);
    
        /**
         * 獲取Set類型的數(shù)據(jù)
         * @param key
         * @return
         */
        Set<String> getSet(String key);
    
        /**
         * 獲取boolean類型的數(shù)據(jù)
         * @param key
         * @return
         */
        boolean getBoolean(String key);
        /**
         * 枚舉:存儲(chǔ)或取出的數(shù)據(jù)類型
         */
        enum DataType {
            INTEGER, LONG, BOOLEAN, FLOAT, STRING, STRING_SET
        }
    }

具體的實(shí)現(xiàn)類:

PS:這是非public的哮肚,不允許外部直接訪問。IPreference的實(shí)現(xiàn)類對(duì)象可通過IPreference中創(chuàng)建的IPreferenceHolder對(duì)象獲取广匙,也可通過創(chuàng)建IPreferenceHolder對(duì)象來獲取允趟,如果想擴(kuò)展,就自己改寫吧

    /**
     * 操作SharedPreferences的工具類
     * @author: DINGXIUAN
     */
    class PreferenceImpl implements IPreference {
    
        private static IPreference iPreference;
    
        /**
         * 對(duì)象鎖
         */
        private static final Object lock = new Object();
    
        /**
         * 獲取IPreference對(duì)象
         * @param context
         * @return
         */
        public static IPreference getPreference(Context context) {
            synchronized (lock) {
                if (iPreference== null) {
                    initPreference(context, FILE_NAME);
                }
            }
            return iPreference;
        }
    
        /**
         * 獲取IPreference對(duì)象
         * @param context
         * @param fileName
         * @return
         */
        public static IPreference getPreference(Context context, String fileName) {
            synchronized (lock) {
                if (iPreference== null) {
                    initPreference(context, fileName);
                }
            }
            return iPreference;
        }
    
        /**
         * 初始化IPreference對(duì)象
         * @param context
         * @param fileName
         */
        private static synchronized void initPreference(Context context, String fileName){
            if (iPreference== null){
                iPreference= new PreferenceImpl(context, fileName);
            }
        }
    
        /**
         * 默認(rèn)的文件名
         */
        private static final String FILE_NAME = "shared_preferences";
    
        private SharedPreferences preferences;
    
        /**
         * Instantiates a new Pref manager.
         *
         * @param context the context
         */
        public PreferenceImpl(Context context){
            preferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        }
    
        /**
         * Instantiates a new Pref manager.
         *
         * @param context  the context
         * @param fileName the file name
         */
        public PreferenceImpl(Context context, String fileName){
            preferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
        }
    
        @Override
        public void put(String key, Object value) {
            SharedPreferences.Editor edit = preferences.edit();
            put(edit, key, value);
            edit.apply();
        }
    
        /**
         * 保存一個(gè)Map集合
         * @param map
         */
        @Override
        public <T> void putAll(Map<String, T> map) {
            SharedPreferences.Editor edit = preferences.edit();
            for(Map.Entry<String, T> entry : map.entrySet()){
                String key = entry.getKey();
                Object value = entry.getValue();
                put(edit, key, value);
            }
            edit.apply();
        }
    
        @Override
        public void putAll(String key, List<String> list) {
            putAll(key, list, new ComparatorImpl());
        }
    
        @Override
        public void putAll(String key, List<String> list, Comparator<String> comparator) {
            Set<String> set = new TreeSet<>(comparator);
            for(String value : list){
                set.add(value);
            }
            preferences.edit().putStringSet(key, set).apply();
        }
    
        /**
         * 根據(jù)key取出一個(gè)數(shù)據(jù)
         * @param key 鍵
         */
        @SuppressWarnings("unchecked")
        @Override
        public <T> T get(String key, DataType type) {
            return (T) getValue(key, type);
        }
    
        @Override
        public Map<String, ?> getAll() {
            return  preferences.getAll();
        }
    
        @Override
        public List<String> getAll(String key) {
            List<String> list = new ArrayList<String>();
            Set<String> set = get(key, DataType.STRING_SET);
            for(String value : set){
                list.add(value);
            }
            return list;
        }
    
        @Override
        public void remove(String key) {
            preferences.edit().remove(key).apply();
        }
    
        @Override
        public void removeAll(List<String> keys) {
            SharedPreferences.Editor edit = preferences.edit();
            for (String k : keys) {
                edit.remove(k);
            }
            edit.apply();
        }
    
        @Override
        public void removeAll(String[] keys) {
            removeAll(Arrays.asList(keys));
        }
    
        @Override
        public boolean contains(String key) {
            return preferences.contains(key);
        }
    
        @Override
        public void clear() {
            preferences.edit().clear().apply();
        }
    
        @Override
        public String getString(String key) {
            return get(key, DataType.STRING);
        }
    
        @Override
        public float getFloat(String key) {
            return get(key, DataType.FLOAT);
        }
    
        @Override
        public int getInteger(String key) {
            return get(key, INTEGER);
        }
    
        @Override
        public long getLong(String key) {
            return get(key, DataType.LONG);
        }
    
        @Override
        public Set<String> getSet(String key) {
            return get(key, DataType.STRING_SET);
        }
    
        @Override
        public boolean getBoolean(String key) {
            return get(key, DataType.BOOLEAN);
        }
    
        /**
         * 保存數(shù)據(jù)
         * @param editor
         * @param key
         * @param obj
         */
        @SuppressWarnings("unchecked")
        private void put(SharedPreferences.Editor editor, String key, Object obj) {
            // key 不為null時(shí)再存入鸦致,否則不存儲(chǔ)
            if (key != null){
                if (obj instanceof Integer){
                    editor.putInt(key, (Integer)obj);
                } else if (obj instanceof Long){
                    editor.putLong(key, (Long)obj);
                } else if (obj instanceof Boolean){
                    editor.putBoolean(key, (Boolean)obj);
                } else if (obj instanceof Float){
                    editor.putFloat(key, (Float) obj);
                } else if (obj instanceof Set){
                    editor.putStringSet(key, (Set<String>) obj);
                } else if (obj instanceof String){
                    editor.putString(key, String.valueOf(obj));
                }
            }
        }
    
        /**
         * 根據(jù)key和類型取出數(shù)據(jù)
         * @param key
         * @return
         */
        private Object getValue(String key, DataType type){
            switch (type) {
                case INTEGER:
                    return preferences.getInt(key, -1);
                case FLOAT:
                    return preferences.getFloat(key, -1f);
                case BOOLEAN:
                    return preferences.getBoolean(key, false);
                case LONG:
                    return preferences.getLong(key, -1L);
                case STRING:
                    return preferences.getString(key, null);
                case STRING_SET:
                    return preferences.getStringSet(key, null);
                default: // 默認(rèn)取出String類型的數(shù)據(jù)
                    return null;
            }
        }
    
    }

比較器:

    /**
     * 默認(rèn)比較器潮剪,當(dāng)存儲(chǔ)List集合中的String類型數(shù)據(jù)時(shí),沒有指定比較器分唾,就使用默認(rèn)比較器
     */
    public class ComparatorImpl implements Comparator<String> {
    
        @Override
        public int compare(String lhs, String rhs) {
            return lhs.compareTo(rhs);
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抗碰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绽乔,更是在濱河造成了極大的恐慌弧蝇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件折砸,死亡現(xiàn)場離奇詭異看疗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睦授,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門鹃觉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人睹逃,你說我怎么就攤上這事〉豢希” “怎么了沉填?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佑笋。 經(jīng)常有香客問我翼闹,道長,這世上最難降的妖魔是什么蒋纬? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任猎荠,我火速辦了婚禮,結(jié)果婚禮上蜀备,老公的妹妹穿的比我還像新娘关摇。我一直安慰自己,他們只是感情好碾阁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布输虱。 她就那樣靜靜地躺著,像睡著了一般脂凶。 火紅的嫁衣襯著肌膚如雪宪睹。 梳的紋絲不亂的頭發(fā)上愁茁,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音亭病,去河邊找鬼鹅很。 笑死,一個(gè)胖子當(dāng)著我的面吹牛罪帖,可吹牛的內(nèi)容都是我干的促煮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胸蛛,長吁一口氣:“原來是場噩夢啊……” “哼污茵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起葬项,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤泞当,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后民珍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體襟士,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年嚷量,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陋桂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝶溶,死狀恐怖嗜历,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抖所,我是刑警寧澤梨州,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站田轧,受9級(jí)特大地震影響暴匠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傻粘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一每窖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弦悉,春花似錦窒典、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春后室,著一層夾襖步出監(jiān)牢的瞬間缩膝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工岸霹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疾层,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓贡避,卻偏偏與公主長得像痛黎,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刮吧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法湖饱,類相關(guān)的語法,內(nèi)部類的語法杀捻,繼承相關(guān)的語法井厌,異常的語法,線程的語...
    子非魚_t_閱讀 31,664評(píng)論 18 399
  • 寫著寫著發(fā)現(xiàn)簡書提醒我文章接近字?jǐn)?shù)極限致讥,建議我換一篇寫了仅仆。 建議52:推薦使用String直接量賦值 一般對(duì)象都是...
    我沒有三顆心臟閱讀 1,351評(píng)論 2 4
  • 好吧,我們來看看孤單垢袱! 最早的孤單來自于身邊沒有人和你一起做你喜歡的事墓拜。 第一次感到孤單是爸...
    原來如此孤單閱讀 327評(píng)論 0 0
  • 終于到了外國,好久沒坐飛機(jī)请契,好久沒出來玩咳榜,心情還是愉悅的,舒服爽锥!
    DeathKnightR閱讀 260評(píng)論 0 0
  • 今天分享的書是《好奇心》作者: [英] 伊恩·萊斯利 作者說好奇心救恨,才是獲得成功的最大驅(qū)動(dòng)力。內(nèi)心強(qiáng)大的驅(qū)動(dòng)力是推...
    任清清閱讀 298評(píng)論 3 8