android 數(shù)據(jù)存儲(chǔ)

一安拟、保存到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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末但两,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子供置,更是在濱河造成了極大的恐慌谨湘,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異紧阔,居然都是意外死亡坊罢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)擅耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)活孩,“玉大人,你說(shuō)我怎么就攤上這事乖仇『度澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵乃沙,是天一觀的道長(zhǎng)起趾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)警儒,這世上最難降的妖魔是什么训裆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮冷蚂,結(jié)果婚禮上缭保,老公的妹妹穿的比我還像新娘。我一直安慰自己蝙茶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布诸老。 她就那樣靜靜地躺著隆夯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪别伏。 梳的紋絲不亂的頭發(fā)上蹄衷,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音厘肮,去河邊找鬼愧口。 笑死,一個(gè)胖子當(dāng)著我的面吹牛类茂,可吹牛的內(nèi)容都是我干的耍属。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼巩检,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厚骗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起兢哭,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤领舰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體冲秽,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舍咖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锉桑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片排霉。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖刨仑,靈堂內(nèi)的尸體忽然破棺而出郑诺,到底是詐尸還是另有隱情,我是刑警寧澤杉武,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布辙诞,位于F島的核電站,受9級(jí)特大地震影響轻抱,放射性物質(zhì)發(fā)生泄漏飞涂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一祈搜、第九天 我趴在偏房一處隱蔽的房頂上張望较店。 院中可真熱鬧,春花似錦容燕、人聲如沸梁呈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)官卡。三九已至,卻和暖如春醋虏,著一層夾襖步出監(jiān)牢的瞬間寻咒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工颈嚼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毛秘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓阻课,卻偏偏與公主長(zhǎng)得像叫挟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柑肴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容