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