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物件
- 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>