1.使用SharedPreference方便地存儲數(shù)據(jù)
1.1適用與哪些地方吮龄?
保存用戶偏好的參數(shù)----是否自動登陸魔策,是否記住賬號密碼,是否在Wifi下才能 聯(lián)網(wǎng)等相關(guān)信息仪媒!SharedPreferences使用xml文件, 然后類似于Map集合,使用鍵-值的形式來存儲數(shù)據(jù)
1.2獲取SharedPreference
我們可以通過以下兩種方法之一創(chuàng)建或者訪問shared preference 文件:
⑴.getSharedPreferences()— 如果需要多個通過名稱參數(shù)來區(qū)分的shared preference文件, 名稱可以通過第一個參數(shù)來指定∪眉撸可在app中通過任何一個Context執(zhí)行該方法矛绘。
Context context = getActivity();//在此Activity下使用,getContext則可在整個APP下使用
SharedPreferences sharedPref = context.getSharedPreferences(getString(R.string.preference_file_key),Context.MODE_PRIVATE);
⑵.getPreferences()— 當(dāng)activity僅需要一個shared preference文件時辱匿。因為該方法會檢索activity下默認(rèn)的shared preference文件键痛,并不需要提供文件名稱。
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
1.3寫匾七、刪Shared Preference
為了寫shared preferences文件絮短,需要通過執(zhí)行edit()創(chuàng)建一個 SharedPreferences.Editor。通過類似putInt()與putString()等方法傳遞keys與values昨忆,刪除只需獲取Key值就可進行刪除丁频,修改只需將value值改變再寫入即可,最后通過apply()---推薦使用邑贴,提交改變.
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.apply();//異步寫席里,不占用UI
1.4讀Shared Preference
為了從shared preference中讀取數(shù)據(jù),可以通過類似于 getInt() 及 getString()等方法來讀取拢驾。在那些方法里面?zhèn)鬟f我們想要獲取的value對應(yīng)的key奖磁,并提供一個默認(rèn)的value作為查找的key不存在時函數(shù)的返回值。如下:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score),default);
2.隨心所欲地管理文件
2.1Android文件的操作模式
2.2存儲在內(nèi)部還是外部
所有的Android設(shè)備均有兩個文件存儲區(qū)域:"internal" 與 "external" 繁疤。 這兩個名稱來自于早先的Android系統(tǒng)咖为,當(dāng)時大多設(shè)備都內(nèi)置了不可變的內(nèi)存(internal storage)及一個類似于SD card(external storage)這樣的可卸載的存儲部件。之后有一些設(shè)備將"internal" 與 "external" 都做成了不可卸載的內(nèi)置存儲稠腊,雖然如此躁染,但是這一整塊還是從邏輯上有被劃分為"internal"與"external"的。只是現(xiàn)在不再以是否可卸載進行區(qū)分了架忌。 下面列出了兩者的區(qū)別:
2.2.1?Internal storage:
1.總是可用的
2.這里的文件默認(rèn)只能被我們的app所訪問吞彤。
3.當(dāng)用戶卸載app的時候,系統(tǒng)會把internal內(nèi)該app相關(guān)的文件都清除干凈鳖昌。
4.Internal是我們在想確保不被用戶與其他app所訪問的最佳存儲區(qū)域备畦。
2.2.2 External storage:
1.并不總是可用的低飒,因為用戶有時會通過USB存儲模式掛載外部存儲器,當(dāng)取下掛載的這部分后懂盐,就無法對其進行訪問了褥赊。
2.是大家都可以訪問的,因此保存在這里的文件可能被其他程序訪問莉恼。
3.當(dāng)用戶卸載我們的app時拌喉,系統(tǒng)僅僅會刪除external根目錄(getExternalFilesDir())下的相關(guān)文件。
4.External是在不需要嚴(yán)格的訪問權(quán)限并且希望這些文件能夠被其他app所共享或者是允許用戶通過電腦訪問時的最佳存儲區(qū)域俐银。.
2.2.3 獲取External存儲的權(quán)限
為了寫數(shù)據(jù)到external storage, 必須在你manifest文件中請求WRITE_EXTERNAL_STORAGE權(quán)限:
<uses-permission android :name="android.permission.WRITE_EXTERNAL_STORAGE"/>
對于internal storage尿背,我們不需要聲明任何權(quán)限,因為程序默認(rèn)就有讀寫程序目錄下的文件的權(quán)限捶惜。
2.2.4 文件的相關(guān)操作
2.3 如何訪問SDcard
2.4讀取各目錄下的文件
2.4.1讀取raw和assets文件夾下的文件:
res/raw:
文件會被映射到R.java文件中田藐,訪問的時候直接通過資源ID即可訪問,而且 他不能有目錄結(jié)構(gòu)吱七,就是不能再創(chuàng)建文件夾
assets:
不會映射到R.java文件中汽久,通過AssetManager來訪問,能有目錄結(jié)構(gòu)踊餐,即可以自行創(chuàng)建文件夾
讀取文件資源:
res/raw:
InputStreamis=getResources().openRawResource(R.raw.filename);
assets:
AssetManager am=getAssets();
InputStream is=am.open("filename");