一、常見(jiàn)數(shù)據(jù)存儲(chǔ)方式
在android中,通用的數(shù)據(jù)存儲(chǔ)歸納方式可以總結(jié)為一下幾類:
文件存儲(chǔ):將數(shù)據(jù)存儲(chǔ)在文件中。文件存儲(chǔ)根據(jù)位置不同,可以存儲(chǔ)在應(yīng)用的包下,也可以存儲(chǔ)在公共的sd上,稱之為外部存儲(chǔ)。
SharedPreference存儲(chǔ):將數(shù)據(jù)以鍵值對(duì)的形式進(jìn)行存儲(chǔ),該種存儲(chǔ)方式一般會(huì)存一些引用的設(shè)置信息,屬于一種輕量級(jí)的存儲(chǔ)機(jī)制。xml
SQLite數(shù)據(jù)庫(kù)存儲(chǔ):Android系統(tǒng)中的輕量級(jí)關(guān)系型數(shù)據(jù),允許用戶進(jìn)行創(chuàng)建表結(jié)構(gòu),存儲(chǔ)應(yīng)用數(shù)據(jù)等操作。
使用ContentProvider存儲(chǔ)數(shù)據(jù):在應(yīng)用程序之間,共享或者傳遞相關(guān)信息時(shí),往往可以使用Content Provider和ContentResolver實(shí)現(xiàn),在前文已經(jīng)做過(guò)敘述,此處不再贅述。
網(wǎng)絡(luò)獲取:通過(guò)接口數(shù)據(jù)從服務(wù)器后臺(tái)獲取,需要網(wǎng)絡(luò)訪問(wèn)
SharedPreference存儲(chǔ)
SharedPreference是Android提供的用來(lái)存儲(chǔ)一些簡(jiǎn)單配置信息的一種機(jī)制,核心原理是:保存基于XML文件存儲(chǔ)的key-value鍵值對(duì)數(shù)據(jù)。通常使用該種方式用來(lái)存儲(chǔ)一些簡(jiǎn)單信息,例如:應(yīng)用版本信息,應(yīng)用主題類型等等。其采用了Map數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù),以鍵值對(duì)的方式存儲(chǔ),可以簡(jiǎn)單的讀取與寫(xiě)入。
主要的特點(diǎn)和用法總結(jié)如下所示:
SharedPreferences本身是一個(gè)接口,無(wú)法直接創(chuàng)建SharedPreferences實(shí)例。可以通過(guò)Context提供的getSharedPreferences(String name, int mode)方法來(lái)獲取SharedPreferences實(shí)例,第一個(gè)參數(shù)表示要操作的xml文件名,第二個(gè)參數(shù)表示操作模式:MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE,推薦使用MODE_PRIVATE。
Editor:SharedPreferences只能獲取數(shù)據(jù),不能存儲(chǔ)和修改。存儲(chǔ)修改是通過(guò)SharedPreferences.edit()獲取的內(nèi)部接口Editor對(duì)象實(shí)現(xiàn)。
SharedPreferences對(duì)應(yīng)的xml文件位置:/data/data/package name/shared_prefs/
文件存儲(chǔ)
內(nèi)部存儲(chǔ)
核心原理:上下文Context提供了很多方法來(lái)打開(kāi)數(shù)據(jù)文件里的文件,常用的API如下:
getDir(String name,int mode):內(nèi)部存儲(chǔ)根目錄下的文件夾,如果不存在則會(huì)新建。該目錄的位置是data/data/《包名》/。
getFilesDir():返回報(bào)名目錄下的文件夾,對(duì)應(yīng)的目錄依然是data/data/《包名》/files/
fileList():列舉文件和文件夾,對(duì)應(yīng)的目錄是data/data/《包名》/files/
openFileInput(String name):打開(kāi)文件輸入流(不存在則拋出FileNotFoundException)
openFileOut(String name,int mode):打開(kāi)文件輸出流(文件不存在則新建)
deleteFile(String name):刪除文件或文件夾
總結(jié),以上這些Context提供的關(guān)于目錄和文件的操作,均是在data/dat/包名及其目錄下進(jìn)行操作的。
緩存
getCacheDir:獲取應(yīng)用的緩存文件夾,緩存文件夾的目錄位置是:data/data/包名/cache/
getCodeCacheDir:存放優(yōu)化過(guò)的代碼,比如JIT優(yōu)化
文件訪問(wèn)模式
MODE_PRIVATE:只對(duì)在應(yīng)用內(nèi)可見(jiàn),使用最多的就是這種模式。
MODE_APPEND:如果文件存在,則在文件末尾追加;文件不存在,則與 MODE_PRIVATE 相同。
MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE:允許其他應(yīng)用訪問(wèn),但是在API17版本已經(jīng)被棄用,不在推薦使用,從API版本24開(kāi)始,禁止使用這兩種常量模式。
外部存儲(chǔ)
除了內(nèi)部存儲(chǔ)空間可以存儲(chǔ)內(nèi)容外,在移動(dòng)設(shè)備商,均帶有外部存儲(chǔ)介質(zhì),即外部存儲(chǔ)(如SD卡)。但是隨著設(shè)備內(nèi)置存儲(chǔ)空間增大,很多設(shè)備已經(jīng)足以將內(nèi)置存儲(chǔ)空間一分為二,一塊為內(nèi)部存儲(chǔ),一塊為外部存儲(chǔ)。使用外部存儲(chǔ)有兩個(gè)點(diǎn)需要注意:
需要檢測(cè)外部存儲(chǔ)介質(zhì)是否已經(jīng)掛載
外部存儲(chǔ)的空間,所有的應(yīng)用都可以訪問(wèn)并執(zhí)行讀寫(xiě)操作。
聲明讀寫(xiě)權(quán)限:WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE,從API19開(kāi)始,已經(jīng)不再需要聲明讀寫(xiě)權(quán)限。
外部存儲(chǔ)空間可以分為兩個(gè)部分,私有目錄和公共目錄
私有目錄(private)
私有目錄(private)對(duì)應(yīng)的存儲(chǔ)路徑是storage/emulated/0/Android/,私有目錄的特點(diǎn)是:
每個(gè)應(yīng)用獨(dú)占以包名命名的私有文件夾
這些私有文件夾在應(yīng)用卸載時(shí)被刪除
適合使用的場(chǎng)景是:非私密數(shù)據(jù),需要隨應(yīng)用卸載而刪除的一些數(shù)據(jù)
私有目錄的路徑是storage/emulated/0/Android/data/《包名》/,系統(tǒng)提供的主要API包括:
getExternalCacheDir:cache文件夾
getExternalCacheDirs:多部分cache文件夾
getExternalFilesDir:files文件夾
getExternalFIlesDirs:多部分files文件夾
getExternalMediaDirs:多媒體文件夾
公共目錄(public)
在外部存儲(chǔ)介質(zhì)中,除了私有目錄外,還有一些公共的目錄。這些公共目錄:
所有應(yīng)用共享
在應(yīng)用卸載時(shí)不會(huì)被刪除
適用于非私密的數(shù)據(jù),不需要隨應(yīng)用卸載刪除
公共目錄的存儲(chǔ)路徑是storage/emulated/0/,系統(tǒng)提供的主要的API包括:
getExternalStorageDirectory:外部存儲(chǔ)根目錄
getExternalStoragePublicDirectory:外部存儲(chǔ)根目錄下的文件夾
getExternalStorageState:外部存儲(chǔ)狀態(tài)
SQLite數(shù)據(jù)庫(kù)
SQLite 一個(gè)非常流行的嵌入式數(shù)據(jù)庫(kù),它支持 SQL 語(yǔ)言,并且只利用很少的內(nèi)存就有很好的性能。此外它還是開(kāi)源的,任何人都可以使用它。許多開(kāi)源項(xiàng)目((Mozilla, PHP, Python)都使用了 SQLite。
Android 在運(yùn)行時(shí)(run-time)集成了 SQLite,所以每個(gè) Android 應(yīng)用程序都可以使用 SQLite 數(shù)據(jù)庫(kù)。對(duì)于熟悉 SQL 的開(kāi)發(fā)人員來(lái)時(shí),在 Android 開(kāi)發(fā)中使用 SQLite非常簡(jiǎn)單。
存儲(chǔ)路徑
數(shù)據(jù)庫(kù)存儲(chǔ)在 data/包名/databases/ 下。
創(chuàng)建數(shù)據(jù)庫(kù)
Android 不自動(dòng)提供數(shù)據(jù)庫(kù)。在 Android 應(yīng)用程序中使用 SQLite,必須自己創(chuàng)建數(shù)據(jù)庫(kù),數(shù)據(jù)表、索引等內(nèi)容。
SQLiteOpenHelper
Android 提供了 SQLiteOpenHelper 幫助開(kāi)發(fā)者創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),只要繼承 SQLiteOpenHelper 類即可。SQLiteOpenHelper 類根據(jù)需要,封裝了創(chuàng)建和更新數(shù)據(jù)庫(kù)使用的邏輯。SQLiteOpenHelper 的子類,至少需要實(shí)現(xiàn)三個(gè)方法:
構(gòu)造函數(shù):調(diào)用父類 SQLiteOpenHelper 的構(gòu)造函數(shù)。這個(gè)方法需要四個(gè)參數(shù):上下文環(huán)境(例如,一個(gè) Activity),數(shù)據(jù)庫(kù)名字,一個(gè)可選的游標(biāo)工廠(通常是 Null),一個(gè)代表你正在使用的數(shù)據(jù)庫(kù)模型版本的整數(shù)。
onCreate方法:該方法需要一個(gè) SQLiteDatabase 對(duì)象作為參數(shù),根據(jù)需要對(duì)這個(gè)對(duì)象填充表和初始化數(shù)據(jù)。
onUpgrage方法:該方法需要三個(gè)參數(shù),一個(gè) SQLiteDatabase 對(duì)象,一個(gè)舊的版本號(hào)和一個(gè)新的版本號(hào),這樣你就可以清楚如何把一個(gè)數(shù)據(jù)庫(kù)從舊的模型轉(zhuǎn)變到新的模型。
責(zé)任編輯人:CC
評(píng)論
查看更多