SharedPreferences 使用

SharedPreferences是使用鍵值對(duì)的方式來存儲(chǔ)數(shù)據(jù)的。Android中得到SharedPrefernces方法的方法有以下三種:

1.Context的getSharedPreferences(String name, int mode)钥屈。
name為文件的名稱,如果指定的文件不存在則會(huì)創(chuàng)建一個(gè),文件都是存放在/data/data/<package name:="">/shared prefs目錄下的抖棘。mode指定操作模式歇由,目前只有MODE_PRIVATE這一種模式可選场航,也是默認(rèn)的操作模式萍肆,與直接傳入0效果是相同的袍榆,表示只有當(dāng)前的應(yīng)用程序才可以對(duì)這個(gè)指定文件進(jìn)行讀寫。其他幾種操作模式均已被廢棄匾鸥,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE已在Android 4.2中被廢棄的蜡塌,MODE_MULTI_PROCESS在Android 6.0中被廢棄碉纳。</package>

2.Activity類的getPreferences(int mode)勿负。
這個(gè)方法會(huì)自動(dòng)將當(dāng)前活動(dòng)類名作為文件名,只接收一個(gè)操作模式參數(shù)劳曹。

3.РrеfеrеnсеМаnаgеr類的PreferenceManager.getDefaultSharedPreferences(Context context)
這是一個(gè)靜態(tài)方法奴愉,將應(yīng)用程序的包名作為前綴來命名文件名,接收一個(gè)Context 參數(shù)铁孵。

基本使用:

1.保存數(shù)據(jù)

SharedPreferences.Editor editor = getSharedPreferences("name",MODE_PRIVATE).edit();
editor.putString("userName","Tom");
editor.putInt("age",21);
editor.putBoolean("married",false);
editor.apply();

2.讀取數(shù)據(jù)

SharedPreferences sharedPreferences = getSharedPreferences("name",MODE_PRIVATE);
sharedPreferences.getString("userName","");
sharedPreferences.getInt("age",0);
sharedPreferences.getBoolean("married",false);

流程圖:

sp 中幾種文件創(chuàng)建模式:

  1. MODE_PRIVATE
    默認(rèn)的模式锭硼,當(dāng)前創(chuàng)建的文件只能被當(dāng)前 Application 使用。

2.MODE_WORLD_READABLE
讀模式蜕劝,允許其他應(yīng)用程序讀取該文件檀头,在 Android N 之后會(huì)有一個(gè) SecurityException 異常。@Deprecated

3.MODE_WORLD_WRITEABLE
寫模式岖沛,允許其他應(yīng)用程序?qū)懭朐撐募钍迹?Android N 之后會(huì)有一個(gè) SecurityException 異常。@Deprecated

4.MODE_MULTI_PROCESS
多進(jìn)程模式婴削,這種模式是不安全的廊镜,官方不建議使用,可以使用 ContentProvider 來代替唉俗。當(dāng)設(shè)置MODE_MULTI_PROCESS模式, 則每次getSharedPreferences過程, 會(huì)檢查SP文件上次修改時(shí)間和文件大小, 一旦所有修改則會(huì)重新從磁盤加載文件嗤朴。@Deprecated

SharedPreference提交的commit與apply的區(qū)別

這兩個(gè)方法的區(qū)別在于:

  1. apply沒有返回值而commit返回boolean表明修改是否提交成功
  2. apply是將修改數(shù)據(jù)原子提交到內(nèi)存, 而后異步真正提交到硬件磁盤, 而commit是同步的提交到硬件磁盤,因此虫溜,在多個(gè)并發(fā)的提交commit的時(shí)候雹姊,他們會(huì)等待正在處理的commit保存到磁盤后在操作,從而降低了效率衡楞。而apply只是原子的提交到內(nèi)容吱雏,后面有調(diào)用apply的函數(shù)的將會(huì)直接覆蓋前面的內(nèi)存數(shù)據(jù),這樣從一定程度上提高了很多效率。
  3. apply方法不會(huì)提示任何失敗的提示坎背。
    由于在一個(gè)進(jìn)程中替劈,sharedPreference是單實(shí)例,一般不會(huì)出現(xiàn)并發(fā)沖突得滤,如果對(duì)提交的結(jié)果不關(guān)心的話陨献,建議使用apply,當(dāng)然需要確保提交成功且有后續(xù)操作的話懂更,還是需要用commit的眨业。

SharedPreferences 工具類:


/**
 * spName :為文件名
 *  key 值    通過key得到value
 *
 *
 *  Commit: 在當(dāng)前線程中  立即提交 寫入到文件中
 *
 *  Apply:也可以提交數(shù)據(jù)    不會(huì)占用主線程。會(huì)創(chuàng)建子線程在后臺(tái)將內(nèi)容寫入到SD 卡中沮协。
 */
public class MvpSpUtils {
    //創(chuàng)建一個(gè)sp 的文件
    private static final String  DEFAULT_SP_NAME = "mvp_sp_config";
    //定義一個(gè)16進(jìn)制的變量
    private static final int TYPE_COMMIT = 0X100;
    private static final int TYPE_APPLY = 0X101;

    //創(chuàng)建靜態(tài)的 方法   返回值為String 的方法  包含一個(gè)參數(shù)  key     通過key得到value
    public static String getString(String key){
        return getString(DEFAULT_SP_NAME, key);
    }
    //創(chuàng)建靜態(tài)的方法   返回值為String 的方法  包含二個(gè)參數(shù)  key  spName     通過key得到value
    public static String getString(String spName,String key){
        return MvpManager.getContext().getSharedPreferences(spName, Context.MODE_PRIVATE).getString(key,null);
    }

    //創(chuàng)建靜態(tài)的 方法   返回值為long 的方法  包含一個(gè)參數(shù)  key     通過key得到value
    public static long getLong(String key){
        return getLong(DEFAULT_SP_NAME, key);
    }
    //創(chuàng)建靜態(tài)的方法   返回值為long 的方法  包含二個(gè)參數(shù)  key  spName     通過key得到value
    public static long getLong(String spName,String key){
        return MvpManager.getContext().getSharedPreferences(spName,Context.MODE_PRIVATE).getLong(key,0);
    }
    //刪除   key   清除文件
    public static void remove(String key){

        remove(DEFAULT_SP_NAME,key);
    }

    //刪除   key  將spName 文件清除
    public static void remove(String spName,String key){
        SharedPreferences preferences =  MvpManager.getContext().getSharedPreferences(spName,Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.remove(key);
        editor.commit();
    }


    public static void saveCommit(String key, Object value){
        saveString(DEFAULT_SP_NAME,key,value,TYPE_COMMIT);
    }


    public static void saveCommit(String spName, String key, Object value){
        saveString(spName,key,value,TYPE_COMMIT);
    }

    public static void saveApply(String spName, String key, Object value){
        saveString(spName,key,value,TYPE_APPLY);
    }

    public static void saveApply(String key, Object value){
        saveString(DEFAULT_SP_NAME,key,value,TYPE_APPLY);
    }
        //保存文件     將key  value 保存在以spName 的文件中 龄捡,
    private static void saveString(String spName,String key,Object value,int type){

        SharedPreferences preferences =  MvpManager.getContext().getSharedPreferences(spName,Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        //但是遇到不同的情況可以進(jìn)行判斷
        if(value instanceof String){
            editor.putString(key,value.toString());
        }else if(value instanceof Float){
            editor.putFloat(key, (Float) value);
        }else if(value instanceof Integer){
            editor.putInt(key, (Integer) value);
        }else if(value instanceof Boolean){
            editor.putBoolean(key, (Boolean) value);
        }else if(value instanceof Long){
            editor.putLong(key, (Long) value);
        }
        //如果是type_apply  就以apply 提交數(shù)據(jù)   否則相反
        if(type == TYPE_APPLY){
            editor.apply();
        }else{
            editor.commit();
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市慷暂,隨后出現(xiàn)的幾起案子聘殖,更是在濱河造成了極大的恐慌,老刑警劉巖行瑞,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奸腺,死亡現(xiàn)場離奇詭異,居然都是意外死亡血久,警方通過查閱死者的電腦和手機(jī)突照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氧吐,“玉大人讹蘑,你說我怎么就攤上這事≈耍” “怎么了座慰?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豁翎。 經(jīng)常有香客問我角骤,道長,這世上最難降的妖魔是什么心剥? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任邦尊,我火速辦了婚禮,結(jié)果婚禮上优烧,老公的妹妹穿的比我還像新娘蝉揍。我一直安慰自己,他們只是感情好畦娄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布又沾。 她就那樣靜靜地躺著弊仪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杖刷。 梳的紋絲不亂的頭發(fā)上励饵,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音滑燃,去河邊找鬼役听。 笑死,一個(gè)胖子當(dāng)著我的面吹牛表窘,可吹牛的內(nèi)容都是我干的典予。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼乐严,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼瘤袖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昂验,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤捂敌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后凛篙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黍匾,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年呛梆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磕诊。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡填物,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霎终,到底是詐尸還是另有隱情滞磺,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布莱褒,位于F島的核電站击困,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏广凸。R本人自食惡果不足惜阅茶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谅海。 院中可真熱鬧脸哀,春花似錦、人聲如沸扭吁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝌诡,卻和暖如春溉贿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浦旱。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工顽照, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闽寡。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓代兵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親爷狈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子植影,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350