一安拟、保存到SharedPreference
SharedPreferences 對(duì)象指向一個(gè)保存key-value pairs的文件,并為讀寫(xiě)他們提供了簡(jiǎn)單的方法麻蹋。每個(gè) SharedPreferences 文件均由framework管理寺酪,其既可以是私有的,也可以是共享的展东。
獲取SharedPreference
getSharedPreferences()— 如果需要多個(gè)通過(guò)名稱(chēng)參數(shù)來(lái)區(qū)分的shared preference文件, 名稱(chēng)可以通過(guò)第一個(gè)參數(shù)來(lái)指定赔硫〕淳悖可在app中通過(guò)任何一個(gè)Context執(zhí)行該方法。
getPreferences()— 當(dāng)activity僅需要一個(gè)shared preference文件時(shí)爪膊。因?yàn)樵摲椒〞?huì)檢索activity下默認(rèn)的shared preference文件权悟,并不需要提供文件名稱(chēng)。(它以private模式訪問(wèn)推盛,該文件僅能被我們的app訪問(wèn))
Caution:如果創(chuàng)建了一個(gè)MODE_WORLD_READABLE或者MODE_WORLD_WRITEABLE模式的shared preference文件峦阁,則其他任何app均可通過(guò)文件名訪問(wèn)該文件。
寫(xiě)Shared Preference
為了寫(xiě)shared preferences文件耘成,需要通過(guò)執(zhí)行edit()創(chuàng)建一個(gè)SharedPreferences.Editor榔昔。通過(guò)類(lèi)似putInt()與putString()等方法傳遞keys與values,接著通過(guò)commit()提交改變瘪菌。
讀Shared Preference
二撒会、保存到文件
存儲(chǔ)在內(nèi)部還是外部
所有的Android設(shè)備均有兩個(gè)文件存儲(chǔ)區(qū)域:"internal" 與 "external" 。 這兩個(gè)名稱(chēng)來(lái)自于早先的Android系統(tǒng)师妙,當(dāng)時(shí)大多設(shè)備都內(nèi)置了不可變的內(nèi)存(internal storage)及一個(gè)類(lèi)似于SD card(external storage)這樣的可卸載的存儲(chǔ)部件诵肛。之后有一些設(shè)備將"internal" 與 "external" 都做成了不可卸載的內(nèi)置存儲(chǔ),雖然如此默穴,但是這一整塊還是從邏輯上有被劃分為"internal"與"external"的怔檩。只是現(xiàn)在不再以是否可卸載進(jìn)行區(qū)分了。 下面列出了兩者的區(qū)別:
Internal storage:
總是可用的
這里的文件默認(rèn)只能被我們的app所訪問(wèn)蓄诽。
當(dāng)用戶(hù)卸載app的時(shí)候薛训,系統(tǒng)會(huì)把internal內(nèi)該app相關(guān)的文件都清除干凈。
Internal是我們?cè)谙氪_保不被用戶(hù)與其他app所訪問(wèn)的最佳存儲(chǔ)區(qū)域仑氛。
External storage:
并不總是可用的乙埃,因?yàn)橛脩?hù)有時(shí)會(huì)通過(guò)USB存儲(chǔ)模式掛載外部存儲(chǔ)器,當(dāng)取下掛載的這部分后调衰,就無(wú)法對(duì)其進(jìn)行訪問(wèn)了膊爪。
是大家都可以訪問(wèn)的,因此保存在這里的文件可能被其他程序訪問(wèn)嚎莉。
當(dāng)用戶(hù)卸載我們的app時(shí)米酬,系統(tǒng)僅僅會(huì)刪除external根目錄(getExternalFilesDir())下的相關(guān)文件。
External是在不需要嚴(yán)格的訪問(wèn)權(quán)限并且希望這些文件能夠被其他app所共享或者是允許用戶(hù)通過(guò)電腦訪問(wèn)時(shí)的最佳存儲(chǔ)區(qū)域趋箩。
Tip:盡管app是默認(rèn)被安裝到internal storage的赃额,我們還是可以通過(guò)在程序的manifest文件中聲明android:installLocation屬性來(lái)指定程序安裝到external storage加派。當(dāng)某個(gè)程序的安裝文件很大且用戶(hù)的external storage空間大于internal storage時(shí),用戶(hù)會(huì)傾向于將該程序安裝到external storage跳芳。更多安裝信息見(jiàn)App Install Location芍锦。
獲取External存儲(chǔ)的權(quán)限
為了寫(xiě)數(shù)據(jù)到external storage, 必須在你manifest文件中請(qǐng)求WRITE_EXTERNAL_STORAGE權(quán)限:
Caution:目前,所有的apps都可以在不指定某個(gè)專(zhuān)門(mén)的權(quán)限下做讀external storage的動(dòng)作飞盆。但這在以后的安卓版本中會(huì)有所改變娄琉。如果我們的app只需要讀的權(quán)限(不是寫(xiě)), 那么將需要聲明READ_EXTERNAL_STORAGE權(quán)限。為了確保app能持續(xù)地正常工作吓歇,我們現(xiàn)在在編寫(xiě)程序時(shí)就需要聲明讀權(quán)限孽水。
但是,如果我們的程序有聲明WRITE_EXTERNAL_STORAGE權(quán)限城看,那么就默認(rèn)有了讀的權(quán)限女气。
保存到Internal Storage
當(dāng)保存文件到internal storage時(shí),可以通過(guò)執(zhí)行下面兩個(gè)方法之一來(lái)獲取合適的目錄作為FILE的對(duì)象:
getFilesDir(): 返回一個(gè)File测柠,代表了我們app的internal目錄炼鞠。
getCacheDir(): 返回一個(gè)File,代表了我們app的internal緩存目錄轰胁。請(qǐng)確保這個(gè)目錄下的文件能夠在一旦不再需要的時(shí)候馬上被刪除谒主,并對(duì)其大小進(jìn)行合理限制,例如1MB 软吐。系統(tǒng)的內(nèi)部存儲(chǔ)空間不夠時(shí)瘩将,會(huì)自行選擇刪除緩存文件。
可以使用File()構(gòu)造器在那些目錄下創(chuàng)建一個(gè)新的文件凹耙,如下:
File file = new File(context.getFilesDir(), filename);
同樣姿现,也可以執(zhí)行openFileOutput()獲取一個(gè)FileOutputStream用于寫(xiě)文件到internal目錄。如下:
同樣肖抱,也可以執(zhí)行openFileOutput()獲取一個(gè)FileOutputStream用于寫(xiě)文件到internal目錄备典。如下:
如果需要緩存一些文件,可以使用createTempFile()意述。例如:下面的方法從URL中抽取了一個(gè)文件名提佣,然后再在程序的internal緩存目錄下創(chuàng)建了一個(gè)以這個(gè)文件名命名的文件。
Note:我們的app的internal storage 目錄以app的包名作為標(biāo)識(shí)存放在Android文件系統(tǒng)的特定目錄下[data/data/com.example.xx]荤崇。 從技術(shù)上講拌屏,如果文件被設(shè)置為可讀的,那么其他app就可以讀取該internal文件术荤。然而倚喂,其他app需要知道包名與文件名。若沒(méi)有設(shè)置為可讀或者可寫(xiě)瓣戚,其他app是沒(méi)有辦法讀寫(xiě)的端圈。因此我們只要使用了MODE_PRIVATE焦读,那么這些文件就不可能被其他app所訪問(wèn)。
保存文件到External Storage
因?yàn)閑xternal storage可能是不可用的舱权,比如遇到SD卡被拔出等情況時(shí)矗晃。因此在訪問(wèn)之前應(yīng)對(duì)其可用性進(jìn)行檢查。我們可以通過(guò)執(zhí)行getExternalStorageState()來(lái)查詢(xún)external storage的狀態(tài)宴倍。若返回狀態(tài)為MEDIA_MOUNTED, 則可以讀寫(xiě)张症。示例如下:
盡管external storage對(duì)于用戶(hù)與其他app是可修改的,我們可能會(huì)保存下面兩種類(lèi)型的文件啊楚。
Public files:這些文件對(duì)與用戶(hù)與其他app來(lái)說(shuō)是public的吠冤,當(dāng)用戶(hù)卸載我們的app時(shí),這些文件應(yīng)該保留恭理。例如,那些被我們的app拍攝的圖片或者下載的文件郭变。
Private files: 這些文件完全被我們的app所私有颜价,它們應(yīng)該在app被卸載時(shí)刪除。盡管由于存儲(chǔ)在external storage诉濒,那些文件從技術(shù)上而言可以被用戶(hù)與其他app所訪問(wèn)周伦,但實(shí)際上那些文件對(duì)于其他app沒(méi)有任何意義。因此未荒,當(dāng)用戶(hù)卸載我們的app時(shí)专挪,系統(tǒng)會(huì)刪除其下的private目錄。例如片排,那些被我們的app下載的緩存文件寨腔。
想要將文件以public形式保存在external storage中,請(qǐng)使用getExternalStoragePublicDirectory()方法來(lái)獲取一個(gè) File 對(duì)象率寡,該對(duì)象表示存儲(chǔ)在external storage的目錄迫卢。這個(gè)方法會(huì)需要帶有一個(gè)特定的參數(shù)來(lái)指定這些public的文件類(lèi)型,以便于與其他public文件進(jìn)行分類(lèi)冶共。參數(shù)類(lèi)型包括DIRECTORY_MUSIC或者DIRECTORY_PICTURES. 如下:
如果剛開(kāi)始的時(shí)候乾蛤,沒(méi)有預(yù)定義的子目錄存放我們的文件,可以在 getExternalFilesDir()方法中傳遞null. 它會(huì)返回app在external storage下的private的根目錄捅僵。
請(qǐng)記住家卖,getExternalFilesDir() 方法會(huì)創(chuàng)建的目錄會(huì)在app被卸載時(shí)被系統(tǒng)刪除。如果我們的文件想在app被刪除時(shí)仍然保留庙楚,請(qǐng)使用getExternalStoragePublicDirectory().
無(wú)論是使用 getExternalStoragePublicDirectory() 來(lái)存儲(chǔ)可以共享的文件上荡,還是使用 getExternalFilesDir() 來(lái)儲(chǔ)存那些對(duì)于我們的app來(lái)說(shuō)是私有的文件,有一點(diǎn)很重要醋奠,那就是要使用那些類(lèi)似DIRECTORY_PICTURES的API的常量榛臼。那些目錄類(lèi)型參數(shù)可以確保那些文件被系統(tǒng)正確的對(duì)待伊佃。例如,那些以DIRECTORY_RINGTONES類(lèi)型保存的文件就會(huì)被系統(tǒng)的media scanner認(rèn)為是ringtone而不是音樂(lè)沛善。
查詢(xún)剩余空間
如果事先知道想要保存的文件大小航揉,可以通過(guò)執(zhí)行getFreeSpace()orgetTotalSpace()來(lái)判斷是否有足夠的空間來(lái)保存文件,從而避免發(fā)生IOException金刁。那些方法提供了當(dāng)前可用的空間還有存儲(chǔ)系統(tǒng)的總?cè)萘俊?br>
然而帅涂,系統(tǒng)并不能保證可以寫(xiě)入通過(guò)getFreeSpace()查詢(xún)到的容量文件, 如果查詢(xún)的剩余容量比我們的文件大小多幾MB尤蛮,或者說(shuō)文件系統(tǒng)使用率還不足90%媳友,這樣則可以繼續(xù)進(jìn)行寫(xiě)的操作,否則最好不要寫(xiě)進(jìn)去产捞。
Note:并沒(méi)有強(qiáng)制要求在寫(xiě)文件之前去檢查剩余容量醇锚。我們可以嘗試先做寫(xiě)的動(dòng)作,然后通過(guò)捕獲 IOException 坯临。這種做法僅適合于事先并不知道想要寫(xiě)的文件的確切大小焊唬。例如,如果在把PNG圖片轉(zhuǎn)換成JPEG之前看靠,我們并不知道最終生成的圖片大小是多少赶促。
刪除文件
在不需要使用某些文件的時(shí)候應(yīng)刪除它。刪除文件最直接的方法是直接執(zhí)行文件的delete()方法挟炬。
myFile.delete();
如果文件是保存在internal storage鸥滨,我們可以通過(guò)Context來(lái)訪問(wèn)并通過(guò)執(zhí)行deleteFile()進(jìn)行刪除
myContext.deleteFile(fileName);
Note:當(dāng)用戶(hù)卸載我們的app時(shí),android系統(tǒng)會(huì)刪除以下文件:
所有保存到internal storage的文件谤祖。
所有使用getExternalFilesDir()方式保存在external storage的文件婿滓。
然而,通常來(lái)說(shuō)泊脐,我們應(yīng)該手動(dòng)刪除所有通過(guò) getCacheDir() 方式創(chuàng)建的緩存文件空幻,以及那些不會(huì)再用到的文件。
三容客、保存到數(shù)據(jù)庫(kù)
這里就不寫(xiě)秕铛,可以使用第三方的數(shù)據(jù)庫(kù)比較方便,比如greendao缩挑,realm等等
源地址:http://wiki.jikexueyuan.com/project/android-training-geek/data-storage-index.html