1. 程式人生 > >Android儲存之SharePreferences

Android儲存之SharePreferences

有的時候,應用程式有少量的資料需要儲存,而且這些資料的格式比較簡單,都是普通的字串、標量型別的值等,比如應用程式的各種配置資訊(如是否開啟音效、是否使用振動效果等)、小遊戲的玩家積分(如掃雷英雄榜的)等。對於這種資料,Android使用SharePreference進行儲存。

一、SharedPreferences與Editor簡介

1、SharedPreferences與Editor簡介

SharedPreference**儲存的資料主要是類似於配置資訊格式的資料,因此它儲存的資料主要是簡單型別的key_value對。**

SharePreferences介面主要負責讀取應用程式的Perferences資料,它提供瞭如下常用方法來訪問SharedPreferences中的key-value對。

  • boolean contains(String key):判斷SharedPreferences是否包含特定key的資料。
  • abstract MapString , ? > getAll():獲取SharePreference資料裡全部key-value對。
  • boolean getXxx(String key,xxx defValue):獲取SharedPreferences資料裡指定key對應的value。如果該key不存在,則返回預設只defValue。其中xxx可以是boolean、float、int、long、String等各種基本型別的值。

SharedPreference介面本身並沒有提供寫入資料的能力,而是通過SharedPreferences的內部介面,SharedPreferences呼叫edit()方法獲取對應的Editor物件

。Editor提供瞭如下方法來向SharedPreferences寫入資料。

  • SharedPreference.Editor clear():清空SharedPreferences裡的所有資料
  • SharedPreference.Editor putXxx(String key,xxx value):向SharedPreferences存入指定key對應的資料。其中xxx可以是boolean,float、int、long、String等各種基本型別的值。
  • SharedPreferences.Editor remove(String key):刪除SharedPreference裡指定key對應的資料項。
  • boolean commit():當Editor編輯完成之後,呼叫概方法提交修改。

SharedPreferences本身是一個介面,程式無法直接建立Context提供的getSharedPreferences(String name,int mode)方法來獲取SharePreferences例項,改方法的第二個引數支援如下幾個值。

  • Context.MODE_PRIVATE:指定SharePreference資料只能被本應用程式讀寫。
  • Context_WORLD_READABLE:指定改SharedPreferences資料能被其他應用程式讀,但不能寫。
  • Context_WORLD_WRITEABLE:指定改SharedPreferences資料能被其他應用程式讀寫。

注意:從Android 4.2開始,Android不再推薦使用MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE兩種模式,因為這兩種模式允許其他應用程式來讀或寫本應用建立的資料,因此容易導致安全漏洞。

2、SharedPreferences的儲存位置和格式

下面程式示範瞭如何向SharedPreferences中寫入、讀取資料。該程式的介面很簡單,它只是提供了兩個按鈕,其中一個用於寫入資料,一個用於讀取資料,故此不再給出介面佈局檔案。
程式程式碼如下

public class MainActivity extends Activity
{
    SharedPreferences preferences;
    Shared Preferences.Editor editor;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //只能獲取被本應用程式讀寫的SharedPreferences物件
        preferences = getSharedPrefences("user_info",MODE_PRIVATE);
        editor = preference.edit();
        Button read = (Button)findViewById(R.id.read);
        Button write = (Button)findViewById(R.id.write);
        read.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View view){
                //讀取字串資料
                String time = preferences.getString("time",null);
                //讀取int型別的資料
                int randNum = preference.getInt("random",0);
                String result = time == null ? "您暫時還未寫入資料":"寫入時間為:" + time +
                    "\n上次生成的隨機數為:" + randNum;
                //使用Toast提示資訊
                Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
            }
        });
        write.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View view){
                //SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日" + 
                    "hh:mm:ss");
                //存入當前時間
                editor.putString("time",sdf.format(new Date()));
                //存入一個隨機數
                editor.putString("random",(int)(Math.random() * 100));
                //提交所有存入的資料
                editor.commit();
            }
        });
    }
}

執行上面的程式,單擊程式中”寫入資料”按鈕,程式將完成SharedPreferences寫入。SharedPreference總是儲存在/data/data/package name/prefs目錄下,SharedPreference資料總是以XML格式儲存

檢視該XML檔案,可以看到如下檔案內容:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="time">2016年10月6日 13:06:51</string>
    <int name="random" value="21"/>
</map>