SharedPreferences在Android中的常用用法及注意事項

一、前言

SharedPreferences是Android平臺上一個輕量級的存儲輔助類,通常用來保存應用的一些常用數據。它提供了string,set,int,long,float,boolean六種數據類型,其數據最終是以xml形式進行存儲。(本文底部有其使用例子)

二、常用方法及注意事項

1. 獲取SharedPreferences對象有三種方法
(1) Context類中的getSharedPreferences(arg1, arg2)方法。arg1:文件名;arg2:操作模式。
(2) Activity類中的getPreferences(arg1)方法。arg1:操作模式(和1一樣),文件名默認爲當前活動的類名。
(3) PreferenceManager類中的getDefaultSharedPreferences(arg1)方法。arg1:爲Context,文件名爲當前包名爲前綴。

2. 卸載軟件時纔會把SharedPreferences生成的文件刪除;在不卸載軟件重裝的時,其文件插入是疊加式的:當遇到key名稱與類型均一樣時,則覆蓋其值;如果其key值一樣,但類型不同,其將插入。
(1) 剛開始安裝時:

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",28);
editor.putInt("age",29); //與上述key名稱與類型均一樣,進行覆蓋,即int age = 29
editor.putString("age",30); //與上述key名稱一樣,類型不一樣,進行插入,即String age = "30"		
editor.commit();

執行代碼,其將生成一個data.xml如下:

<?xml ...>
<map>
	<string name="name">Tom</string>
	<int name="age" value="29" />
	<string name="age">30</string>
</map>	

(2)接上重新安裝後(不卸載,覆蓋式安裝):

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name","Davi");
editor.commit();

執行代碼,發現data.xml如下:(發現剛纔的數據還在,只是name字段內容變了)

<?xml ...>
<map>
	<string name="name">Davi</string>
	<int name="age" value="29" />
	<string name="age">30</string>
</map>	

(3) 接上載覆後重新安裝:(即卸載軟件)

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();		
editor.putString("name","Davi");
editor.commit();

執行代碼,其生成一個data.xml如下:

<?xml ...>
<map>
	<string name="name">Davi</string>
</map>

3. 取出時,如果key的名稱和類型匹配,則優先取出;如果找不到key和類型匹配的,則取出key一樣的;如果依然找不到匹配,則使用默認值。
(1) 假如data.xml如下:

<?xml ...>
<map>
	<int name="age" value="29" />
</map>	

取出時:

SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);		
String sname = pref.getString("name","hello");  //由於沒有name這個字段,故sname的值爲"hello"
int iage = pref.getInt("age",0); //由於有age這個字段,並且爲int類型,故iage的值爲29

(2) 假如data.xml如下:

<?xml ...>
<map>
	<string name="name">Davi</string>
	<string name="age">30</string>
</map>	

取出時:

SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);		
String sname = pref.getString("name","hello");  //由於有name這個字段,故sname的值爲"Davi"
int iage = pref.getInt("age",0); //有age這個字段,但其爲string類型,但變量類型爲int, 從string轉int會出現異常

4. commit()和apply()的區別
(1) commit()有boolen返回值代表插入是否成功,apply()沒有。
(2) apply()將數據原子操作提交到內存,然後異步提交到磁盤。commit()是同步提交到硬盤。

三、測試源碼:

1、界面文件: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">

    <Button
        android:id="@+id/save_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Save data"
        />
     <Button
        android:id="@+id/show_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Show data"
        />
</LinearLayout>

2、控制界面:MainActivity.java

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{
	private Button saveData;
	private Button showData;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        saveData = (Button)findViewById(R.id.save_data);
        saveData.setOnClickListener(this);
        
        showData = (Button)findViewById(R.id.show_data);
        showData.setOnClickListener(this);    
    }
	@Override
	public void onClick(View v) {
		switch(v.getId())
		{
		case R.id.save_data:
			// TODO Auto-generated method stub
			SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
			editor.putString("name","Tom");
			editor.putInt("age",28);
			editor.putBoolean("married", true);
			editor.commit();
			
			Toast.makeText(MainActivity.this, "save ok " + R.id.save_data, Toast.LENGTH_SHORT).show();
			break;
		case R.id.show_data:
			// TODO Auto-generated method stub
			SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
			String name = pref.getString("name","");
			int age = pref.getInt("age", 0);
			boolean married = pref.getBoolean("married", false);
			
			String war = name + " " + age + " " + married;
			Toast.makeText(MainActivity.this, war, Toast.LENGTH_SHORT).show();
			break;
		default:
			Toast.makeText(MainActivity.this, "err", Toast.LENGTH_SHORT).show();
			break;	
		}	
	} 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章