1. 程式人生 > >Android學習之基礎知識九—資料儲存(持久化技術)

Android學習之基礎知識九—資料儲存(持久化技術)

  資料持久化是將那些記憶體中的瞬時資料儲存到儲存裝置,保證即使在手機或電腦關機的情況下,這些資料仍然不會丟失。

  Android系統中主要提供了3種方式用於簡單地實現資料持久化功能:檔案儲存、SharedPreference儲存、資料庫儲存。除了這三種方式外,還可以將資料儲存在手機的SD卡中,不過相對比較麻煩,而且安全性方面也相對較低。下面我們就來了解一下這三種資料持久化的方式:

一、檔案儲存

  檔案儲存是Android中最基本的一種資料儲存方式,它不對儲存的內容進行任何的格式化處理,所有的資料都原原封不動的儲存在檔案當中,因此它比較適合用於儲存一些簡單的文字資料或二進位制資料。如果你想要使用檔案儲存的方式來儲存一些較為複雜的文字資料,就需要定義一套自己的格式規範,這樣可以方便之後將資料從檔案中重新解析出來。

1.1、將資料儲存在檔案中

第一步:建立專案:FilePersistenceTest,在activity_main.xml中設定一個輸入框

第二步:將在輸入框中輸入的資料儲存在檔案中

第三步:執行程式,輸入一段文字後,點選Back鍵退出程式

第四步:檢視檔案

  我們在儲存資料的時候,只設置了檔名,而沒有設定儲存路徑,這是因為所有的檔案預設都是儲存在:/data/data/包名/files/目錄下,要找到這個路徑,需要開啟:Android Device Monitor,步驟如下:

  找到SDK目錄 ---> tools目錄下 ---> 點選monitor.bat開啟 --->找到:File Explore欄 ---> 該欄下到:/data/data/com.workspace.hh.filepersistencetest/files/data.(注意:這裡的包名是你自己的包名

)---> 找到後點擊右上角的匯出按鈕,將data檔案匯出並開啟。

 

 

1.2、從檔案中取出資料

 第一步:取出資料,下面程式碼中有兩個地方需要注意:

  1、呼叫EditText的:setSelection()方法是為了將輸入的游標移動到文字的末尾位置,以便於繼續輸入。

  2、對字串進行非空判斷的時候,使用了:TextUtils.isEmpty()方法,這是一個非常好的方法,它可以進行兩種空值的判斷,當傳入的字串等於null或者等於空字串的時候,這個方法都是返回的true.所以我們不需要先單獨判斷這兩種空值再使用邏輯運算子連線起來了。

第二步:執行程式(左),我們重新輸入文字(中),然後點選Back鍵退出程式後,再開啟程式(右)

  

1.3、總結

   檔案儲存用到的核心就是Context類提供的:openFileInput()和openFileOutput()兩種方法。但是它不適合用於儲存一些較為複雜的文字資料。

 二、SharedPreferences儲存

  SharedPreferences儲存是另一種資料持久化的方式,它比檔案儲存更加簡單易用,而且可以很方便對某一指定的資料進行讀寫儲存。不同於檔案的儲存方式,SharedPreferences是使用鍵值對的方式來儲存資料的。也就是說,當儲存一條資料的時候,需要給這條資料提供一個對應的鍵,這樣在讀取資料的時候就可以通過這個鍵把相應的值取出來。而且SharedPreferences還支援很多不同的資料型別儲存,如果儲存的資料型別是整型,那麼讀出來的資料也是整型的;如果儲存的資料是一個字串,那麼讀取出來的資料仍然是字串。

2.1、將資料儲存到SharedPreferences中

  要想使用SharedPreferences來儲存資料,首先要獲取到SharedPreferences物件。Android中主要提供了三種方法用於得到SharedPreferences物件:

第一種:Context類中的:getSharedPreferences()方法

  這個方法接收兩個引數,第一個引數指定SharedPreferences檔案的名稱,如果檔案不存在就會自動建立一個,SharedPreferences檔案都是存放在:/data/data/專案包名/shared_prefs/目錄下。第二個引數用於指定操作模式,目前只有:MODE_PRIVATE這一種模式可選。它是預設的操作模式,和直接傳入0的效果是相同的,表示只有當前的應用程式才可以對這個SharedPreferences檔案進行讀寫,其他幾種操作模式均已被廢棄。

第二種:Activity類中的:getPreferences()方法

  這個方法和Context中的:getSharedPreferences()方法很相似,不過它只接收一個操作模式引數,因為使用這個方法時會自動將當前活動的類名作為SharedPreferences的檔名。

第三種:PreferenceManager類中的:getDefaultSharedPreferences()方法

  這個方法是一個靜態的方法,它接收一個Context引數,並自動使用當前應用程式的包名作為字首來命名SharedPreferences檔案。

上面是三種得到SharedPreferences物件的方法,得到SharedPreferences物件之後,就可以開始向SharedPreferences檔案儲存資料了,主要分為三步實現:

  (1)呼叫SharedPreferences物件的:edit()方法來獲取一個SharedPreferences.Editor物件

  (2)向SharedPreferences.Editor物件中新增資料,比如新增一個布林型資料就使用:putBoolean()方法,新增一個字串則使用:putString()方法,以此類推。

  (3)呼叫:apply()方法將新增的資料提交,從而完成資料儲存操作。

下面我們就來體驗一下SharedPreferences儲存的用法:

第一步:新建SharedPreferencesTest專案,在activity_main.xml中設定一個按鈕

第二步:在活動中給按鈕新增監聽事件,實現通過點選按鈕來儲存指定資料的功能,這裡是通過第一種方法來獲取的SharedPreferences物件。

第三步:執行程式,開啟Android Device Monitor,找到:/data/data/專案包名/shared_prefs/目錄下的data檔案

第四步:匯出檔案並開啟,我們可以看到資料是使用XML格式來儲存的。

 

2.2、從SharedPreferences中讀取資料

   SharedPreferences物件中提供 一系列get方法,用於對儲存的資料進行讀取,每種get方法都對應了SharedPreferences.Editor中的一種put方法,比如讀取一個布林型資料就使用getBoolean()方法,讀取一個字串就使用:getString()方法,這些get方法都接收兩個引數,第一個引數是鍵,傳入儲存資料時使用的鍵就可以得到相應的值了;第二個引數是預設值,即表示當傳入的鍵找不到對應的值時會以什麼樣的預設值進行返回。

相對於儲存資料,取出資料就更加簡單了:

第一步:設定一個取出資料的按鈕:Restore Data

第二步:設定按鈕的監聽事件,通過點選按鈕將取出的資料打印出來

第三步:執行程式,點選按鈕,檢視打印出來的日誌,這樣我們就把資料取出來了。

2.3、實現記住密碼的功能

 第一步:藉助BroadcastBestPractice專案,在該專案中直接編輯。首先在登入介面設定一個複選框和提示記住密碼的文字:

  CheckBox控制元件是一個複選框控制元件,使用者可以通過點選的方式來進行選中和取消。

第二步:實現邏輯

程式碼分析:

   首先在onCreate()方法中獲取到SharedPreferences物件,然後呼叫它的getBoolean()方法去獲取remember_password這個鍵對應的值。一開始當然不存在對應的值了,所以會使用預設值false,這樣就什麼都不會發生。接著在登入成功之後,如果使用者想要記住密碼,勾選了複選框,這時將remember_password設定為true,然後把account和password對應的值都儲存到SharedPreferences檔案當中並提交,如果複選框沒有被選中,就簡單的呼叫一下clear()方法,將SharedPreferences檔案中的資料全部清除掉。

  當用戶選中了記住密碼的複選框,併成功登入一次後,remember_password鍵對應的值就是true了,這個時候如果再重新啟動登入介面,就會從SharedPreferences檔案中將儲存的賬號和密碼都讀取出來,並填充到文字輸入框中,然後把記住密碼複選框選中,這樣就完成記住密碼的功能了。

第三步:執行程式,可以看到介面上多了一個記住密碼複選框,點選登入,就會跳轉到MainActivity,接著在MainActivity中發出一條強制下線的廣播,會讓程式重新回到登入介面,此時你會發現,賬號和密碼都已經填充到介面上了,如下圖所示:登入前(左)、登入後(右)

  

注意:

   從上面螢幕上我們看到:Account和Password距離螢幕邊框太近,我們在這裡可以設定一個:android:layout_margin屬性,調整它距離邊框的位置:

然後重新執行程式效果如下:

   

2.4、總結

   上面實現的記住密碼的功能只是個簡單的例項,並不能在實際的專案中直接使用。因為將密碼以文明的形式儲存在SharedPreferences檔案中是非常不安全的,很容易就會被別人盜取,因此在正式的專案裡還需要結合一定的演算法來對密碼進行保護才行。

   接著我們開始將第三種資料持久化技術:SQLite資料庫儲存。由於這一部分涉及的內容很多,我們單獨拿一講來講述。