Ch17 SharedPreference與檔案應用
SharedPreference是Android系統提供最簡單的資料存取方式,它適用於儲存一些簡單的資料。與SharedPreference比較,檔案應用因為能使用外部的擴充記憶體(如SD卡),所以可以儲存的資料量比較大,但因為外部擴充記憶體屬於可攜式記憶設備,可以很方便的移至其他裝置(如PC)上使用,儲存的資料可能會被其他裝置讀取,因此安全性較差。
一、Shared Preference資料存取說明 「Shared Preference」在Android系統屬於輕量級資料保存方法,一般用於保存應用程式中與使用者相關的一些偏好設定,這些資料可以由此應用程式的所有使用者共享,因此稱為Shared Preference。 儲存的位置在記憶體的「/data/data/<專案套件>/shared-prefs/<filename>.xml」。
Shared Preference是透過SharegPreferences類別管理儲存的資料,此類別下層有2個介面: SharedPreferences.Editor是用以修改SharedPreferences物件中的值。 SharedPreferences.OnSharedPreferenceChangeListener偵聽器,是偵聽當SharedPreferences內容改變時所觸發的「onSharedPreferenceChanged」事件。
使用SharedPreferences儲存資料的步驟如下: 用「getSharedePreferences(String prefName, int operateMode)」方法,取得SharedPreferences類別的實體物件(這物件其實就是指定名稱偏好檔的代理者)。 第1個字串參數是要建立的偏好檔名稱。 第2個整數參數是此偏好的操作模式,可以使用的模式有: MODE_PRIVATE:0,建立的檔案只能用於此應用程式。 MODE_WORLD_READABLE:1,建立的檔案允許其他應用程式讀取。
MODE_WORLD_WRITEABLE:2,建立的檔案允許其他應用程式修改。 透過SharedPreferences物件的「edit()」方法建立此偏好檔的編輯器(Editor)物件,此物件是SharedPreferences.Editor介面的實作。 利用Editor物件提供的方法,將資料以「鍵/值」對的形式加到Editor物件內,Editor物件依資料型式不同,提供有不同的寫入方法,通用的格式為 put<資料型式>(String key, <dataType> value); 上一步的put方法只是將資料寫到Editor物件,要將資料真的寫到偏好檔,還需要執行Editor物件的「apply()」或「commit()」方法。
使用SharedPreferences讀取資料的步驟如下: 用「getSharedePreferences(String prefName, int operateMode)」方法,取得SharedPreferences類別的實體物件。 依資料型式使用SharedPreferences物件適當的讀取方法,讀取指定鍵值的資料;讀取資料通用的格式為 get<資料型式>(String key, <dataType> defaultValue);
清空指定名稱偏好檔內容的步驟: 建立參考到SharedPreferences物件的欄位。 用「getSharedePreferences(String prefName, int operateMode)」方法,取得SharedPreferences類別的實體物件。 透過SharedPreferences物件的「edit()」方法建立此偏好檔的編輯器(Editor)物件。 執行Editor物件的「clear()」方法。 執行Editor物件的「apply()」或「commit()」方法,執行之後此SharedPreferences物件將只剩下同樣在這次交付中的資料,這次交付前的資料全部被清除。
二、使用者資料存取範例 UsedPreference Test範例 簡單的模擬要求使用者在第一次使用時登錄個人資料與密碼,以後則比對密碼確認是否是合格用戶。 範例執行時先檢查是否存有使用者個人資料,如果資料存在則將資料顯示出來(資料讀取);如果資料不存在,則顯示相關資料欄位與「新增」鈕。使用者輸入姓名、密碼與確認欄資料。 範例詳細內容請參考原書 code 17-2。
要驗證是否存在這個偏好檔,可以透過「adb shell」命令列指令,執行步驟如下: 從「開始」功能表開啟「命令提示字元」工具。 輸入「adb shell」,進入shell中,此時命令提示字元改變成「#」符號。 在命令提示字元「#」後輸入「cd /data/data/<專案套件>/shared-prefs」格式的命令,其中「cd」是更換目錄命令。 ;對目前範例應輸入「cd /data/data/ com.example.userpreferencetest /shared-prefs」。 在命令提示字元「#」後輸入「ls」命令。此命令要求列示出此目錄內容清單。 從顯示的內容清單可以看到指定的偏好檔。
三、內建記憶體的檔案存取 Android仍然支援原本Java的檔案管理方法,檔案可以透過輸出串流直接存在行動裝置的內建記憶體中(存在裝置的「/data/data/<專案套件>/files/<檔名>」),預設存在內建記憶體中的檔案是屬於此應用程式私有的,別的應用程式不能存取這些檔案。 對於已經儲存的檔案內容,也能透過輸入串流讀取檔案的內容。
建立及寫入內建記憶體檔案的步驟如下: 利用「openFileOutput(String filename, int Mode)」取得檔案輸出串流(FileOutputStream)物件。 第1 個參數是要寫入的檔案名稱。 第2個整數參數是此檔案的操作模式,可以使用的模式有: MODE_PRIVATE:0,建立的檔案只能用於此應用程式。 MODE_WORLD_READABLE:1,建立的檔案允許其他應用程式讀取。 MODE_WORLD_WRITEABLE:2,建立的檔案允許其他應用程式修改。 MODE_APPEND:32768,如果指定的檔案已經存在,設定此模式會將寫入的資料添加在原內容後面,而不是取代原內容。
透過FileOutputStream物件的「write()」方法將資料寫至檔案。 透過FileOutputStream物件的「close()」方法關閉檔案。 要讀取存在內建記憶體中的檔案內容,則先以「openFileInput(String name)」方法取得檔案輸入串流(FileInputStream)物件,然後以「read(byte[] buffer)」方法讀取位元組陣列,至於陣列大小可以透過FileInputStream物件的「available()」方法得到。
InnerFileAccess Test範例 佈局中有2個EditText元件(writeTxt與readTxt),及2個Button元件(writeBtn與readBtn) 。 當使用者按下「writeBtn」鈕,程式先判斷「writeTxt」元件是否已經鍵入內容;如果已經鍵入,則將輸入的內容以輸出串流存至裝置內建記憶體的「mylocalfile.txt」檔案。 當使用者按下「readBtn」鈕,程式以輸入串流讀取mylocalfile.txt檔案,並將讀取的內容顯示於「readTxt」元件。 範例詳細內容請參考原書 code 17-4。
四、外部檔案存取 如果有大量資料儲存的需求時,則可以利用傳統檔案串流方式,將資料存在「SD卡」中。 ExternalFileAccess Test範例 採用與上一節範例InnerFileAccess Test相同的處理邏輯,只不過這次是將資料存在「SD卡」中。 先在專案的AndroidManifest.xml加入以下對外部儲存裝置寫入的許可申請: <uses-permission android:name="android.permission. WRITE_EXTERNAL_STORAGE" />
範例詳細內容請參考原書 code 17-5。