如果要把数据保存到ShreadPreferences中,首先要通过上下文对象取得里面的getSharedPreferences(name, mode),name代表:文件(xml)的名称,不用指定文件名的后缀,系统自动加上,mode代表存储模式,常用的为private。
使用SharedPreferences保存key-value对的步骤如下:
(1)使用Activity类的getSharedPreferences方法获得SharedPreferences对象,其中存储key-value的文件的名称由getSharedPreferences方法的第一个参数指定。
(2)使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。
(3)通过SharedPreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示不同的数据类型。例如:字符串类型的value需要用putString方法。
(4)通过SharedPreferences.Editor接口的commit方法保存key-value对。commit方法相当于数据库事务中的提交(commit)操作。
示例代码:
//打开Preferences,名称为arr,如果存在则打开它,否则创建新的Preferences
SharedPreferencesarr= getSharedPreferences("example", 0);
Editor editor = arr.edit();//获取编辑器
editor.putString("name", "张三");
editor.putInt("age", 23);
editor.commit();//提交修改
生成的example.xml文件内容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">张三</string>
<int name="age" value="23" />
</map>
使用SharedPreferences取出key-value:
(1)使用Activity类的getSharedPreferences方法获得SharedPreferences对象,需要创建该应用的Context,然后通过Context 访问。
如:SharedPreferences preferences = getContext().getSharedPreferences("example", Context.MODE_PRIVATE);
(2)取出相应数据。如:String name = arr.getString("name","");
示例:
SharedPreferences preferences = getSharedPreferences("arr", Context.MODE_PRIVATE);
String name = preferences.getString("name", "");//第二个参数为默认值,如果key(第一个参数)值不存在,就返回第二个参数指定的值
int age = preferences.getInt("age", 20);
注意:创建文件的项目为a,要在项目b中访问a中的文件。
在b直接这样写的话,访问的是b自己项目底下的文件,访问不到a项目创建的文件。
如果要访问到a项目创建的文件必须在b中构造a应用的上下文对象出来所以应该这样写:
Context otherContext = getContext().createPackageContext(“a所在的包名”, Context.CONTEXT_IGNORE_SECURITY);//第一个参数为a应用所在的包名,第二个参数,因为//要访问其他文件,所以设定为忽略掉安全检测,Context.CONTEXT_IGNORE_SECURITY
SharedPreferences preferences = otherContext.getSharedPreferences("it", Context.MODE_PRIVATE););
//取得内容
String name = preferences.getString("name", "");
int age = preferences.getInt("age", 20);
另外,通过getPreferences(mode);也可以得到SharedPreferences对象!
private static Boolean LIGHTTHEME= PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Strings.SETTINGS_LIGHTTHEME, false);