數(shù)據(jù)持久化存儲(chǔ)--SharedPreference

數(shù)據(jù)持久化--SharedPreference

大致說明

??SP常用于對(duì)基本配置信息的保存,一處修改,多處讀取配置,一般在項(xiàng)目中會(huì)用于對(duì)用戶名的保存、APP是否初次進(jìn)入等配置,適合存儲(chǔ)簡單、輕量級(jí)的數(shù)據(jù)存儲(chǔ)。
  使用步驟大致為 獲取SP對(duì)象、通過SP獲取編輯器 editor,通過editor進(jìn)行添加、修改、移除K-V,清空或者其他操作,但進(jìn)行操作之后務(wù)必要進(jìn)行提交操作,否則操作將無法生效。
  開發(fā)過程中,一般會(huì)將這些操作進(jìn)行封裝,省去重復(fù)編寫這些固定的操作,避免遺漏導(dǎo)致發(fā)生問題。

詳細(xì)描述

  • 1. 使用場景

    1. 一般使用SharedPreference來存儲(chǔ)應(yīng)用程序的配置信息
    2. 一般存儲(chǔ)在應(yīng)用程序的私有存儲(chǔ)區(qū),文件權(quán)限是私有的,只能供寫入者讀取
      使用鍵/值(NVP機(jī)制)來存儲(chǔ)數(shù)據(jù)。支持的數(shù)據(jù)類型(boolean、int、float、long和String)
    3. 存儲(chǔ)在應(yīng)用程序的私有目錄下(data/data/包名 /shared_prefs/)自定義的XML文件中
  • 2. 使用步驟

    • 創(chuàng)建SP對(duì)象 :Context.getSharedPreference(String name,int mode)

      • name: 要操作的文件名
      • mode: 操作權(quán)限
        • Context.MODE_PRIVATE: 指定該SharedPreferences數(shù)據(jù)只能被本應(yīng)用程序讀、寫。
        • Context.MODE_WORLD_READABLE: 指定該SharedPreferences數(shù)據(jù)能被其他應(yīng)用程序讀,但不能寫。 7.0中會(huì)拋安全異常
        • Context.MODE_WORLD_WRITEABLE: 指定該SharedPreferences數(shù)據(jù)能被其他應(yīng)用程序讀,寫。 7.0中會(huì)拋安全異常
      • 其他創(chuàng)建方式:
        • PreferenceManager.getDefaultSharedPreferences(Context context)
          返回以包名為文件名的sp對(duì)象
          public static SharedPreferences getDefaultSharedPreferences(Context context) {
              return context.getSharedPreferences(getDefaultSharedPreferencesName(context),getDefaultSharedPreferencesMode());
          }
          private static String getDefaultSharedPreferencesName(Context context) {
              return context.getPackageName() + "_preferences";
          }
          private static int getDefaultSharedPreferencesMode() {
              return Context.MODE_PRIVATE;
          }??
          
        • getPreferences(int mode)
          activity 專有
          public SharedPreferences getPreferences(int mode) {
              return getSharedPreferences(getLocalClassName(), mode);
          }?
          
    • 使用

      • 通過SharedPreferences.Editor 進(jìn)行一系列操作
        • putXxx(String key , xxx value): 向SharedPreferences存入指定key對(duì)應(yīng)的數(shù)據(jù)
        • clear():清空SharedPreferences里所有數(shù)據(jù)
        • remove(): 刪除SharedPreferences中指定key對(duì)應(yīng)的數(shù)據(jù)項(xiàng)
        • boolean commit(): 當(dāng)Editor編輯完成后,使用該方法提交修改 原子過程 主線程提交?
        • void apply() :異步提交修改,在一個(gè)單線程的線程池中執(zhí)行寫入
  • 3. 注意事項(xiàng)

    • 創(chuàng)建的時(shí)候會(huì)把整個(gè)文件全部加載進(jìn)內(nèi)存
      1. 第一次從sp中獲取值的時(shí)候,有可能阻塞主線程,使界面卡頓、掉幀----主線程會(huì)等待加載SP的線程加載完畢
      2. 解析sp的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)對(duì)象,導(dǎo)致頻繁GC,引起界面卡頓?
      3. 這些key和value會(huì)永遠(yuǎn)存在于內(nèi)存之中,占用大量內(nèi)存? ----getSharedPreference時(shí)會(huì)將所有的SP放到一個(gè)靜態(tài)變量里緩存起來
    • 避免存儲(chǔ)Json等特殊符號(hào)很多的value

      特殊符號(hào)會(huì)在解析時(shí)進(jìn)行特殊處理引發(fā)額外的字符串拼接以及函數(shù)調(diào)用開銷
      - 多次apply會(huì)卡界面
      >Activity在Stop時(shí)會(huì)等待寫入線程寫入完畢
      - 避免跨進(jìn)程

總結(jié)

??SP是開發(fā)當(dāng)中常用的一種數(shù)據(jù)持久化方式,一般APP存儲(chǔ)的配置文件基本是全局通用的,因此維護(hù)一個(gè)通用的SP對(duì)象即可,開發(fā)當(dāng)中可以對(duì)SP進(jìn)行封裝成工具類,Context對(duì)象可以選用自定義的Application實(shí)例,應(yīng)用運(yùn)行過程中只有一個(gè)且一直存在Application,因此可以采取它來對(duì)全局通用的數(shù)據(jù)或方法進(jìn)行管理。
項(xiàng)目地址:https://github.com/ticksj/AllAndroid/blob/master/s_base/src/main/java/com/sj/s_base/utils/SPUtils.java

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容