Android中专门用来存储
轻量级键值对数据
的类,会在本地以xml文件形式存储。
一、 运行机制
接口:
SharedPreferences
在该接口中,定义了一个
Editor
接口、一个
edit
方法、多个
get
方法、一个监听器用于监听内容变更。其中,
Editor
接口主要用来写入数据,
edit
方法用来对外提供一个editor实例,
get
方法用来获取键值对,监听器用于实现类中监听。
接口:
Editor
接口中含有多个
put
方法、一个
commit
方法等。之所以要独立出一个接口来进行写操作,是为了保证数据写入的完整性。主要考虑的场景是如果同时要写入多条键值对,这些键值对不会
逐条写入文件
中,而是
先打包在一起,再一次性写入
,即
one-at-a-time
。具体实现方法是在Editor实现一个hashMap来暂存要写入的数据,先把所有键值对写入内存中的该hashMap中,然后再一次性写入文件中。
该过程可以概括为先
commitToMemory
, 再
writeToFile
。
二、 使用方法
首先,想写入键值对,要先获取一个sharedPreferences
对象。
此时需要提供两个要素:context上下文对象
,对应的文件名字
。如下
SharedPreferences sp = context.getSharedPreferenced("userPref", MODE_PRIVATE);
这里,我们要明确这些键值对的
实际存储方式
:它们是以多个文件的形式存储:
/data/data/{packageName}/shared_prefs/{name}.xml
。其中,实际的
{name}.xml
是在程序中指定的。
那么,我们只要调用
context.getSharedPreferences(name, mode)
即可获取到所在
packageName
文件夹里对应的
name.xml
文件映射过来的
SharedPreferences
对象。其中,
mode
是读取文件的方式。
示例:
SharedPreferences.Editor editor = sp.editor();
editor.put("name", "ihaihai");
editor.commit();
三、理解
我们可以简单的理解为:在手机本地某个地方会存放我们自定义的xml文件,每个文件用来存放相关的键值对数据。比如我们希望存储用户的偏好设置,即可创建一个名为UserPref
的SharedPreferences并读写即可。
四、比较getSharedPreferenced
和getPreference
getSharedPreferenced
获取的文件是在package内都可以使用context对象
获取到的,只需要指定name
就可以获取到特定的xml文件
。
但是,getPreference
方法是专门用在Activity内部
的,创建的xml文件只能在该Activity上下文
内获取,而且不需要指定名字
,这个xml文件只属于这个Activity。
其它就没有区别了。唯一区别就是一个权限域的区别。
示例:
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences("userPref", MODE_PRIVATE);
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
Android中专门用来存储
轻量级键值对数据
的类,会在本地以xml文件形式存储。
一、 运行机制
接口:
SharedPreferences
在该接口中,定义了一个
Editor
接口、一个
edit
方法、多个
get
方法、一个监听器用于监听内容变更。其中,
Editor
接口主要用来写入数据,
edit
方法用来对外提供一个editor实例,
get
方法用来获取键值对,监听器用于实现类中监听。
接口:
Editor
接口中含有多个
put
方法、一个
commit
方法等。之所以要独立出一个接口来进行写操作,是为了保证数据写入的完整性。主要考虑的场景是如果同时要写入多条键值对,这些键值对不会
逐条写入文件
中,而是
先打包在一起,再一次性写入
,即
one-at-a-time
。具体实现方法是在Editor实现一个hashMap来暂存要写入的数据,先把所有键值对写入内存中的该hashMap中,然后再一次性写入文件中。
该过程可以概括为先
commitToMemory
, 再
writeToFile
。
二、 使用方法
首先,想写入键值对,要先获取一个sharedPreferences
对象。
此时需要提供两个要素:context上下文对象
,对应的文件名字
。如下
SharedPreferences sp = context.getSharedPreferenced("userPref", MODE_PRIVATE);
这里,我们要明确这些键值对的
实际存储方式
:它们是以多个文件的形式存储:
/data/data/{packageName}/shared_prefs/{name}.xml
。其中,实际的
{name}.xml
是在程序中指定的。
那么,我们只要调用
context.getSharedPreferences(name, mode)
即可获取到所在
packageName
文件夹里对应的
name.xml
文件映射过来的
SharedPreferences
对象。其中,
mode
是读取文件的方式。
示例:
SharedPreferences.Editor editor = sp.editor();
editor.put("name", "ihaihai");
editor.commit();
三、理解
我们可以简单的理解为:在手机本地某个地方会存放我们自定义的xml文件,每个文件用来存放相关的键值对数据。比如我们希望存储用户的偏好设置,即可创建一个名为UserPref
的SharedPreferences并读写即可。
四、比较getSharedPreferenced
和getPreference
getSharedPreferenced
获取的文件是在package内都可以使用context对象
获取到的,只需要指定name
就可以获取到特定的xml文件
。
但是,getPreference
方法是专门用在Activity内部
的,创建的xml文件只能在该Activity上下文
内获取,而且不需要指定名字
,这个xml文件只属于这个Activity。
其它就没有区别了。唯一区别就是一个权限域的区别。
示例:
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences("userPref", MODE_PRIVATE);
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);