商城項(xiàng)目實(shí)戰(zhàn) | 13.1 Android 數(shù)據(jù)存儲(chǔ)之 SharedPreferences 的存儲(chǔ)方式和安全性

本文為菜鳥(niǎo)窩作者劉婷的連載?!鄙坛琼?xiàng)目實(shí)戰(zhàn)”系列來(lái)聊聊仿”京東淘寶的購(gòu)物商城”如何實(shí)現(xiàn)。
每個(gè)程序猿必備的110本經(jīng)典編程書(shū),免費(fèi)領(lǐng)取地址:http://mp.weixin.qq.com/s/cx433vAj_CDLzmhOoUS6zA
140套Android優(yōu)秀開(kāi)源項(xiàng)目源碼,領(lǐng)取地址:http://mp.weixin.qq.com/s/afPGHqfdiApALZqHsXbw-A
或歡迎勾搭運(yùn)營(yíng)小姐姐(微信 id:BT474849)免費(fèi)領(lǐng)取哦~

在 Android 的數(shù)據(jù)存儲(chǔ)方式總共有五種,分別為 file 文件存儲(chǔ)、 SQlite 數(shù)據(jù)庫(kù)存儲(chǔ)、ContentProvider 內(nèi)容提供器存儲(chǔ)、網(wǎng)絡(luò)存儲(chǔ)以及這篇文章中要介紹的 SharedPreferences 內(nèi)存存儲(chǔ)。其中 SharedPreferences 在應(yīng)用中應(yīng)用的比較多,也比較常見(jiàn)。

SharedPreferences 詳細(xì)介紹

1. SharedPreferences 的原理

SharedPreferences 的核心原理簡(jiǎn)而言之就是一句:鍵值對(duì)的簡(jiǎn)單存儲(chǔ)。SharedPreferences 用來(lái)保存基于 XML 文件存儲(chǔ)的 key-value 鍵值對(duì)數(shù)據(jù),通常用來(lái)存儲(chǔ)一些簡(jiǎn)單的配置信息。通過(guò) DDMS 的 File Explorer 的面板,展開(kāi)文件瀏覽樹(shù),很明顯 SharedPreferences 數(shù)據(jù)總是存儲(chǔ)在 /data/data/<package name>/shared_prefs 目錄下,所以也稱之為內(nèi)存存儲(chǔ)。

2. SharedPreferences 的適用范圍

SharedPreferences 主要是適用于保存少量的數(shù)據(jù),且這些數(shù)據(jù)的格式非常簡(jiǎn)單,有字符串型、整型等基本類型,用的比較多的場(chǎng)合比如應(yīng)用程序的各種配置信息(如是否打開(kāi)音效、是否使用震動(dòng)效果、小游戲的玩家積分等)、QQ 保存密碼等。

3. SharedPreferences 的優(yōu)缺點(diǎn)

SharedPreferences 的原理以及適用范圍顯示了 SharedPreferences 有不少不足之處,但是也說(shuō)明了它有著獨(dú)特的優(yōu)勢(shì)。

3.1 SharedPreferences 的缺點(diǎn)

  1. 只能存儲(chǔ) boolean,int,float,long 和 String 五種簡(jiǎn)單的數(shù)據(jù)類型。
  2. 不論 SharedPreferences 的數(shù)據(jù)存儲(chǔ)操作是如何簡(jiǎn)單,但是存儲(chǔ)的數(shù)據(jù)只是少量的,所以無(wú)法完全替代如 SQLite 數(shù)據(jù)庫(kù)這樣的其他數(shù)據(jù)存儲(chǔ)方式。
  3. 無(wú)法進(jìn)行條件查詢等復(fù)雜操作,對(duì)于數(shù)據(jù)的處理只能是簡(jiǎn)單的處理。

3.2 SharedPreferences 的優(yōu)點(diǎn)

  1. SharedPreferences 存儲(chǔ)數(shù)據(jù)在內(nèi)存中,所以安全性方面比較高。
  2. SharedPreferences 對(duì)象與 SQLite 數(shù)據(jù)庫(kù)相比,免去了創(chuàng)建數(shù)據(jù)庫(kù),創(chuàng)建表,寫(xiě) SQL 語(yǔ)句等諸多操作,使用方法簡(jiǎn)單。
  3. 可以基本滿足對(duì)少量數(shù)據(jù)的存儲(chǔ)操作,如果數(shù)據(jù)量不大的情況下,SharedPreferences 是首選。

在只需要對(duì)簡(jiǎn)單數(shù)據(jù)進(jìn)行存儲(chǔ)的時(shí)候,最優(yōu)的選擇依然是 SharedPreferences,下面來(lái)看下 SharedPreferences 的使用方法。

SharedPreferences 的使用方法

SharedPreferences 作為數(shù)據(jù)存儲(chǔ)方式之一,主要的使用方法就是寫(xiě)數(shù)據(jù)和讀取數(shù)據(jù)了。

1. 寫(xiě)入數(shù)據(jù)

在寫(xiě)入數(shù)據(jù)的時(shí)候涉及到 put 方法,這個(gè)方法在數(shù)據(jù)的處理中很常見(jiàn),下面是 SharedPreferences 中是如何使用 put 來(lái)存儲(chǔ)數(shù)據(jù)的。

public static boolean putInt(Context context, String key, int value) {
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt(key, value);
        return editor.commit();
    }

這里存儲(chǔ)的是 int 類型的數(shù)據(jù),將數(shù)據(jù) put 后,還要有一步就是要 commit ,提交數(shù)據(jù),根據(jù) commit() 方法返回的 boolean 值來(lái)判斷數(shù)據(jù)是否寫(xiě)入成功,true 是寫(xiě)入成功, false 則是操作失敗了。

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

既然寫(xiě)入數(shù)據(jù)的時(shí)候需要 put ,那么獲取數(shù)據(jù)就會(huì)想到 get 方法,沒(méi)錯(cuò),在 SharedPreferences 中獲取數(shù)據(jù)是使用的 get 方法,代碼如下。

 public static int getInt(Context context, String key, int defaultValue) {
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return settings.getInt(key, defaultValue);
    }

直接 get 就可以拿到數(shù)據(jù),如此簡(jiǎn)單的使用也使得 SharedPreferences 實(shí)在是數(shù)據(jù)存儲(chǔ)的很好選擇。

3. 數(shù)據(jù)變化的監(jiān)聽(tīng)

已經(jīng)知道了數(shù)據(jù)的寫(xiě)和讀,那么如何知道存儲(chǔ)的數(shù)據(jù)有所變化了呢,往下看。

SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

            }
        };

settings.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//注冊(cè)數(shù)據(jù)變化監(jiān)聽(tīng)

settings.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//解注冊(cè)數(shù)據(jù)變化監(jiān)聽(tīng)

對(duì)于內(nèi)存中數(shù)據(jù)的變化監(jiān)聽(tīng)也很方便,直接添加監(jiān)聽(tīng)事件就好。

SharedPreferences 的安全性

在本文的前面也說(shuō)過(guò)了,SharedPreferences 的安全性相對(duì)較高,為什么這么說(shuō)呢?首先看下下面這行代碼。

SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);

這是 SharedPreferences 的創(chuàng)建,第一個(gè)參數(shù) PREFERENCE_NAME 表示要操作的 xml 文件名,而第二個(gè)參數(shù)則是對(duì)于數(shù)據(jù)的安全性考慮的,表示文件的訪問(wèn)權(quán)限以及文件數(shù)據(jù)寫(xiě)入方式,主要有以下四種。

Activity.MODE_PRIVATE,//默認(rèn)操作模式,代表該文件是私有數(shù)據(jù),只能被應(yīng)用本身訪問(wèn),在該模式下,寫(xiě)入的內(nèi)容會(huì)覆蓋原文件的內(nèi)容
Activity.MODE_WORLD_READABLE,//表示當(dāng)前文件可以被其他應(yīng)用讀取
Activity.MODE_WORLD_WRITEABLE,//表示當(dāng)前文件可以被其他應(yīng)用寫(xiě)入
Activity.MODE_APPEND//該模式會(huì)檢查文件是否存在,存在就往文件追加內(nèi)容,否則就創(chuàng)建新文件

在默認(rèn)的情況下面,存儲(chǔ)的數(shù)據(jù)是私有的,只能被應(yīng)用本身所訪問(wèn),這也是官方所提倡的,SharedPreferences 相對(duì)于其他的數(shù)據(jù)存儲(chǔ)方式來(lái)講,安全性要高。

結(jié)束語(yǔ)

SharedPreferences 在 Android 開(kāi)發(fā)中是非常常見(jiàn)的數(shù)據(jù)存儲(chǔ)方式,使用簡(jiǎn)單安全性也高。購(gòu)物車模塊中的商品數(shù)據(jù)因?yàn)槭怯脩魰簳r(shí)存儲(chǔ)的商品、加上一般購(gòu)物車中的商品不會(huì)太多,也沒(méi)必要上傳到網(wǎng)絡(luò)服務(wù)器中去,所以在后面的購(gòu)物車的商品數(shù)據(jù)存儲(chǔ)我們也將使用 SharedPreferences 的存儲(chǔ)方式。

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 任何一個(gè)應(yīng)用程序,其實(shí)說(shuō)白了就是在不停地和數(shù)據(jù)打交道,我們聊QQ、看新聞、刷微博,所關(guān)心的都是里面的數(shù)據(jù),...
    AndYMJ閱讀 1,929評(píng)論 2 5
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評(píng)論 25 709
  • 莫名相識(shí)的季節(jié)是誰(shuí)帶來(lái)了風(fēng)的問(wèn)候吹動(dòng)荷葉滾落下雨滴的憂傷我舉起相機(jī)試著留下你安靜時(shí)模樣
    終南山士閱讀 148評(píng)論 0 1
  • 池塘在那里 衰荷將落不落 舊巷在那里 老街將走不走 宇宙在那里 時(shí)光將老不老 我還在這里 但你不會(huì)回頭 我祈愿陽(yáng)光...
    秋意裸裸素色客閱讀 244評(píng)論 2 0
  • 元狀態(tài)機(jī)MSM是C++庫(kù)boost里引入的,全稱是Meta State Machine。元狀態(tài)機(jī)可以簡(jiǎn)單理解為由元...
    vsf_simon閱讀 1,405評(píng)論 0 0

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