我的学习之旅:android的数据存储之SharedPreferences

看了一些关于SharedPreferences使用的资料,记录一下,沉淀自己,参考疯狂Android讲义。

有些时候,应用程序有少量的数据需要保存,而且这些数据的格式很简单:都是普通的字符串、标量类型的值等,比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果等)、判断是否是第一次使用等,对于这种数据,android提供了SharedPreferences进行保存。


1、SharedPreferences与Editor简介

SharedPreferences保存的数据主要是类似于配置格式的数据,因此它保存的数据主要是简单类型的key-value对。


SharedPreferences接口主要负责读取应用程序的Preferences数据,它提供了如下常用方法来访问SharedPreferences中的键值对(key-value):

(1)boolean contains(String key):判断SharedPreferences是否包含特定的key的数据。

(2)abstract Map<String, ?> getAll():获取SharedPreferences数据里的所有key-value对。

(3)boolean getXxx(String key, xxx defValue):获取SharedPreferences数据里指定的key对应的value。如果该key不存在,返回默认值defValue。其中XXX可以是

boolean、float、int、long、String等基本类型的值。


SharedPreferences接口本身并没有提供写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即可获取它所对应的Editor对象。Editor提供了如下方法来向SharedPreferences写入数据。

(1)SharedPreferences.Editor clear():清空SharedPreferences里所有的数据。

(2)SharedPreferences.Editor putXxx(String key, xxx value):向SharedPreferences存入指定key对应的数据。其中XXX可以是boolean、float、int、long、String等各种基本类型的值。

(3)SharedPreferences.Editor remove(String key):删除SharedPreferences里指定key对应的数据项。

(4)boolean commit():当Editor编辑完后,调用该方法提交修改。


 由于SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences实例,其中一种方法是通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,SharedPreferences数据总是以xml格式保存的,第一个参数是指定保存的文件名。而第二参数是指定保存的数据的访问权限,可以取一下几个值:

(1)Context.MODE_PRIVATE :指定该SharedPreferences数据只能被本应用程序读写。

(2)Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写。

(3)Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序写,但不能读。

(4)Context.MODE_APPEND:判断文件是否存在,存在就往追加

(4)Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.

这种方法的好处是可以指定保存的xml文件名。

另一种是通过PreferenceManager.getSharedDefaultPreferences(Context)获取SharedPreferences实例。这种方法不能指定保存的xml文件名,文件名使用默认的:<package name>+"_preferences.xml"的形式。不过如果在一个包里面采用这种方式需要保存多个这样的xml文件,可能会乱掉。所以建议采用第一种指定xml文件名的形式。


2、SharedPreferences的存储位置和格式

下面的程序实现了如何向SharedPreferences中写入、读取数据,该程序的界面很简单,只提供了两个按钮,其中一个用于写入数据,另一个用于读取数据,所有布局就不贴出来了。代码如下:

public class MainActivity extends Activity {
	
	SharedPreferences preferences;
	SharedPreferences.Editor editor;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 获取只能被本应用程序读写的SharedPreferences对象实例。
		preferences = getSharedPreferences("test", MODE_PRIVATE);
		editor = preferences.edit();
		Button write = (Button) findViewById(R.id.write);
		Button read = (Button) findViewById(R.id.read);
		read.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// 读取字符串数据,若不存在则返回null
				String time = preferences.getString("time", null);
				// 读取int类型数据,若不存在则返回0
				int randNum = preferences.getInt("random", 0);
				String result = time == null? "你暂时还没写入数据":"写入时间为:"+time+"\n上次生成的随机数" +
						"为:"+randNum;
				Toast.makeText(MainActivity.this, result, 2000).show();
			}
		});
		write.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日  "+"hh:mm:ss");
				// 存入当前时间
				editor.putString("time", format.format(new Date()));
				// 存入一个随机数
				editor.putInt("random", (int) (Math.random()*1000));
				// 提交所有存入的数据
				editor.commit();
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

SharedPreferences数据总是保存在/data/data/<package name>/shared_prefs目录下。SharedPreferences数据总是以xml个数保存。


3、读、写其他应用SharedPreferences数据

要读写其他应用的SharedPreferences数据,前提是创建该SharedPreferences的应用程序的访问权限,如指定MODE_WORLD_READABLE,表明该SharedPreferences可被其他应用程序读取。

为了读取其他程序的SharedPreferences数据,可以按以下步骤进行:

(1)需要创建其他程序对应的Context,代码如下:

Context otherContext = CreatePackageContext("com.ou.test",Context.CONTEXT_IGNORE_SECURITY);

上面的“com.ou,test”是其他程序的包名,实际上Android系统就是用应用程序的包名来作为该程序的唯一的标识。访问其他程序的SharedPreferences的关键就是获取其他应用程序的Context,Context代表了访问该Android应用的全局信息的接口。


(2)调用其他应用程序的Context的getSharedPreferences(String name, int mode)即可获取相应的SharedPreferences实例对象。

SharedPreferences prefs = otherContext.getSharedPreferences("test",Context.MODE_WORLD_READABLE);

(3)如果需要向其他应用的SharedPreferences数据写入数据,调用SharedPreferences的edit()方法获取相应的Editor。

事实上,如果不通过先获取其他应用的Context,再获取SharedPreferences的方式读取SharedPreferences的数据;可以使用以IO流的方式先读取SharedPreferences对应的xml文件,再通过xml解析来获取数据也行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值