天天看點

Android資料存儲(一)----SharedPreferences詳解

一、android資料的存儲方式:

android系統一共提供了四種資料存儲方式。分别是:sharepreference、sqlite、content provider和file;此外還有一種網絡存儲。由于android系統中,資料基本都是私有的,都是存放于“data/data/程式包名”目錄下,是以要實作資料共享,正确方式是使用content provider。

在android中,可以使用幾種方式實作資料持久化:

shared preferences:除sqlite資料庫外,另一種常用的資料存儲方式。共享參數形式,一種以key-value的鍵值對形式儲存資料的方式,其本質就是一個xml檔案。android内置的,一般應用的配置資訊,推薦使用此種方式儲存。

internal storage:使用android裝置自帶的記憶體存儲資料。

external storage:使用外部儲存設備存儲資料,一般是指sdcard。

sqlite databases:以sqlite資料庫存儲結構化的資料。sqlite是一個輕量級的資料庫,支援基本sql文法,是常被采用的一種資料存儲方式。android為此資料庫提供了一個名為sqlitedatabase的類,封裝了一些操作資料庫的api。

network connection:使用基于網絡的服務擷取資料。

1、android系統檔案目錄:

Android資料存儲(一)----SharedPreferences詳解

2、android的應用資料存儲機制:

在android中,第三方應用及其資料,都存放在data目錄下。其中,應用安裝包會被存放到/data/app/目錄下,每個安裝包的檔案名都形如:應用包名.apk,以避免重複。比如包名為com.test.sample的應用,其應用資料的目錄為/data/data/com.test.sample/。對應的資料庫檔案存儲在/data/data/com.test.sample/database/目錄下,設定檔案存儲在/data/data/com.test.sample/shared_prefs/,自定義的應用資料檔案存儲在目錄/data/data/com.test.sample/files/下,等等。

不僅如此,android還會為每個應用建立一個賬号,隻有通過本應用的賬号才有權限去運作該應用的安裝封包件,讀寫應用資料目錄下的檔案(當然root權限除外),進而保證了該應用資料不會再被其他應用擷取或破壞。

3、android的檔案操作:

從應用資料目錄下可以看出,資料檔案可以分成兩類,一類是放置在擴充存儲器中的檔案,即/sdcard/目錄下的檔案,它們可以被各個應用共享;而另一類則是放在該應用資料目錄下檔案,它們僅能被各個應用獨享,不能被其他應用讀寫。

三、sharedpreferences:

在所有應用程式中,都必然涉及資料的互動。有些時候,應用程式有少量的資料需要儲存,并且這些資料的格式很簡單。比如:軟體設定、使用者賬戶設定,使用者習慣設定等,這個時候就可以用到sharedpreferences。

其實,sharedpreferences使用xml格式為android應用提供一種永久的資料存貯方式,并且是使用鍵值對的方式來存儲資料的。對于一個android應用,它存貯在檔案系統的/data/data/your_app_package_name/shared_prefs/目錄下,可以被處在同一個應用中的所有activity 通路。android 提提供了相關的api來處理這些資料而不需要程式員直接操作這些檔案或者考慮資料同步的問題。

因為sharedpreferences本身是一個接口,程式無法直接建立sharedpreferences的執行個體,隻能通過context提供的getsharedpreferences(string name,int mode)方法來擷取sharedpreferences的執行個體:

此方法接收兩個參數,第一個參數用于指定sharedpreferences檔案的名稱(格式為xml檔案),如果指定的檔案不存在則會建立一個。sharedpreferences檔案都是存放在/data/data/<packagename>/shared_prefs/目錄下的;第二個參數用于指定操作模式:

mode_private:預設操作模式,和直接傳0效果相同,表示隻有目前應用程式才可以對這個sharedpreferences檔案進行讀寫

mode_world_readable:指定此sharedpreferences對其他程式隻讀且無法修改。

mode_world_writeable:指定此sharedpreferences能被其他程式讀寫。

mode_multi_process:android2.3之後已經棄之不用了。

得到sharedpreferences對象後,就可以向sharedpreferences檔案中存儲資料了,主要分為以下三步:

調用sharedpreferences對象的edit()方法來擷取一個sharedpreferences.editor對象

向sharedpreferences.editor對象中添加資料,比如添加一個布爾型資料就使用putboolean方法,添加一個字元串就用putstring()方法,以此類推

調用commit()方法将添加的資料送出,進而完成資料存儲操作

三、執行個體:儲存編輯的短信内容:

通常情況下會發生這樣的問題,我們在編輯短信的同時有電話打進來,那麼接電話肯定是要啟動另一個activiy,那麼目前編輯短信的activity所編輯的資訊我們想暫時儲存下來,等接完電話後回到該activity時,可以繼續編輯短信。該功能需要如何去實作呢?

(1)儲存資料:

首先使用sharedpreferences這個工具類:

Android資料存儲(一)----SharedPreferences詳解
Android資料存儲(一)----SharedPreferences詳解

上方第14行代碼中,調用的方法是:public sharedpreferences getsharedpreferences (string name, int mode)

其中,第一個參數代表xml檔案(不要加字尾名),如果有這個檔案,就會操作這個檔案,如果沒有這個檔案,就會建立這個檔案;第二個參數代表一種操作模式,0代表私有。

然後,我們要在onpause()方法裡儲存資料,之是以在onpause()方法裡儲存,是因為在所有可能會被記憶體銷毀的生命周期函數中,而onpause()方法最先執行。代碼如下:

Android資料存儲(一)----SharedPreferences詳解
Android資料存儲(一)----SharedPreferences詳解

将資料儲存在msg變量中,然後拿到editor這個編輯器,給它put進去。當然,這些隻是在記憶體中操作,如果要反映到檔案當中,還要執行commit()方法。

(2)還原資料:

緊接着,我們要在onresume()方法中重新還原資料:(為什麼要在這個方法中還原資料,不用我多解釋)

當程式中第一次啟動的時候,并沒有儲存資料,是以傳回一個預設的空值。将這個傳回的資料放到etmsg控件中就行了。

現在我們運作程式,是可以執行的。

例如,現在編輯内容,然後去别的程式,再回來的時候(就算我們把程式退出了),編輯的内容還依然存在。這個時候,我們打開檔案浏覽器,發現資料是儲存在/data/data/<packagename>/shared_prefs/目錄的data.xml檔案當中的,而且是永久儲存;是以,當在onresume()方法還原資料之後,我們還要加一部分代碼,來删掉這個檔案裡的内容(無法删除檔案本身),不然就會永久儲存本地成為垃圾了。代碼如下:

Android資料存儲(一)----SharedPreferences詳解
Android資料存儲(一)----SharedPreferences詳解

總結之後,最終的完整版代碼如下:

activity_main.xml檔案代碼:

Android資料存儲(一)----SharedPreferences詳解
Android資料存儲(一)----SharedPreferences詳解

mainactivity.java的代碼如下:

Android資料存儲(一)----SharedPreferences詳解
Android資料存儲(一)----SharedPreferences詳解

運作程式之後,我們在編輯框輸入一些文字:

Android資料存儲(一)----SharedPreferences詳解

退出程式,然後導出data.xml檔案,打開後顯示如下:

Android資料存儲(一)----SharedPreferences詳解

說明輸入的文本被儲存在了data.xml檔案當中。當我們再回到程式,之前輸入的文字會被保留在界面上,而data.xml檔案中的文本則會被清空。

代碼優化:

上方代碼中如果我們在第40行代碼的後面加下面這一行代碼:

當傳回到原程式時,setselection方法可将輸入光标移動到文本的末尾位置以便繼續輸入。裡面的參數sp.getstring("msg", "")是之前所輸入的字元串。

四、執行個體:實作記住密碼的功能

暫略。

五、preferenceactivity類的使用:

後面的章節會講到。