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;	
		}	
	} 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章