標籤:android style blog http color io os 使用 ar
一、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:使用基於網路的服務擷取資料。
二、Android的檔案系統:
1、Android系統檔案目錄:
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的執行個體:
public abstract SharedPreferences getSharedPreferences(String name,int mode)
此方法接收兩個參數,第一個參數用於指定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這個工具類:
1 private EditText etMsg ; 2 private Button sendButton; 3 private SharedPreferences sp; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 10 etMsg = (EditText)findViewById(R.id.editText1);11 sendButton = (Button)findViewById(R.id.button1);12 13 // 擷取共用屬性操作的工具(檔案名稱,操作模式)14 sp = This.getSharedPreferences("data", 0);15 }
上方第14行代碼中,調用的方法是:public SharedPreferences getSharedPreferences (String name, int mode)
其中,第一個參數代表XML檔案(不要加尾碼名),如果有這個檔案,就會操作這個檔案,如果沒有這個檔案,就會建立這個檔案;第二個參數代表一種操作模式,0代表私人。
然後,我們要在onPause()方法裡儲存資料,之所以在onPause()方法裡儲存,是因為在所有可能會被記憶體銷毀的生命週期函數中,而onPause()方法最先執行。代碼如下:
//在onPause()方法中儲存資料 @Override protected void onPause() { super.onPause(); String msg = etMsg.getText().toString(); Editor editor = sp.edit(); editor.putString("msg", msg); //執行方法:public abstract SharedPreferences.Editor putString (String key, String value) editor.commit(); }
將資料儲存在msg變數中,然後拿到Editor這個編輯器,給它put進去。當然,這些只是在記憶體中操作,如果要反映到檔案當中,還要執行commit()方法。
(2)還原資料:
緊接著,我們要在onResume()方法中重新還原資料:(為什麼要在這個方法中還原資料,不用我多解釋)
@Override protected void onResume() { super.onResume(); etMsg.setText(sp.getString("msg", "")); }
當程式中第一次啟動的時候,並沒有儲存資料,所以返回一個預設的空值。將這個返回的資料放到etMsg控制項中就行了。
現在我們運行程式,是可以執行的。
例如,現在編輯內容,然後去別的程式,再回來的時候(就算我們把程式退出了),編輯的內容還依然存在。這個時候,我們開啟檔案瀏覽器,探索資料是儲存在/data/data/<packagename>/shared_prefs/目錄的data.xml檔案當中的,而且是永久儲存;所以,當在onResume()方法還原資料之後,我們還要加一部分代碼,來刪掉這個檔案裡的內容(無法刪除檔案本身),不然就會永久儲存本地成為垃圾了。代碼如下:
protected void onResume() { super.onResume(); etMsg.setText(sp.getString("msg", "")); Editor editor = sp.edit(); editor.clear(); editor.commit(); }
總結之後,最終的完整版代碼如下:
activity_main.xml檔案代碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="0dp" android:gravity="top" android:layout_weight="1" android:ems="10" /> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button" /></LinearLayout>
MainActivity.java的代碼如下:
1 package com.example.smyh001; 2 import android.app.Activity; 3 import android.content.SharedPreferences; 4 import android.content.SharedPreferences.Editor; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.widget.Button; 8 import android.widget.EditText; 9 public class MainActivity extends Activity {10 private EditText etMsg ;11 private Button sendButton;12 private SharedPreferences sp;13 14 @Override15 protected void onCreate(Bundle savedInstanceState) {16 super.onCreate(savedInstanceState);17 setContentView(R.layout.activity_main);18 19 etMsg = (EditText)findViewById(R.id.editText1);20 sendButton = (Button)findViewById(R.id.button1);21 22 // 擷取共用屬性操作的工具23 sp = getSharedPreferences("data", 0);24 }25 //在onPause()方法中儲存資料26 @Override27 protected void onPause() {28 super.onPause();29 String msg = etMsg.getText().toString();30 Editor editor = sp.edit();31 editor.putString("msg", msg);//執行方法:public abstract SharedPreferences.Editor putString (String key, String value) 32 editor.commit(); 33 }34 35 //在onResume()方法中還原資料36 @Override37 protected void onResume() {38 super.onResume();39 etMsg.setText(sp.getString("msg", "")); 40 Editor editor = sp.edit();41 editor.clear();42 editor.commit();43 } 44 }
運行程式之後,我們在編輯框輸入一些文字:
退出程式,然後匯出data.xml檔案,開啟後顯示如下:
說明輸入的文本被儲存在了data.xml檔案當中。當我們再回到程式,之前輸入的文字會被保留在介面上,而data.xml檔案中的文本則會被清空。
代碼最佳化:
上方代碼中如果我們在第40行代碼的後面加下面這一行代碼:
etMsg.setSelection((sp.getString("msg", "")).length());
當返回到原程式時,setSelection方法可將輸入游標移動到文本的末尾位置以便繼續輸入。裡面的參數sp.getString("msg", "")是之前所輸入的字串。
四、執行個體:實現記住密碼的功能
暫略。
五、PreferenceActivity類的使用:
Android資料存放區(一)----SharedPreferences詳解