SharedPreferences 是一种轻量级的数据持久化存储机制。以key/value键值对形式存储在xml文件,用于保存一些应用程序数据。保存在 /data/data/PACKAGE_NAME/shared_prefs /xxx.Xml文件 。
SharedPreferences 只能存储 string,int,float,long和boolean五个基本数据类型。如果需要存取比较复杂的数据类型,则需要对这些数据进行序列化。这一点通过源码可以看到SharedPreferences是个接口它的内部接口是Editor,里面定义了上面五个数据类型的put方法,以及putString、remove、clear、commit、apply方法。
上面可以看出getxx方法不在Edit接口中,他们是在SharedPreferences
父级接口定义的,因此增加、删除、清空方法需要使用edit但get方法不用,下面距离分别验证这些方法。另外下面还有个是检查当前键是否存在 和 可以返回所有可用的键值 两个方法。
- 布局定义了一些按钮
- 定义 getSharedPreferences 工具类
private static SharedPreferences preferences;
public static final String SPNAME = "appSpName";
public static void putString(String key,String value){
getSP().edit().putString(key,value).apply();
Log.e(TAG, "putString: "+ getString(key,"你太着急了"));
}
public static String getString(String key,String defaultValue){
return getSP().getString(key, defaultValue);
}
public static void putInt(String key,int value){
getSP().edit().putInt(key,value).apply();
}
public static int getInt(String key,int defaultValue){
return getSP().getInt(key, defaultValue);
}
public static void putBoolean(String key,boolean value){
getSP().edit().putBoolean(key,value).apply();
}
public static boolean getBoolean(String key,boolean defaultValue){
return getSP().getBoolean(key, defaultValue);
}
public static void putFloat(String key,float value){
getSP().edit().putFloat(key,value).apply();
}
public static float getFloat(String key,float defaultValue){
return getSP().getFloat(key, defaultValue);
}
public static void putLong(String key,long value){
getSP().edit().putLong(key,value).apply();
}
public static long getLong(String key,long defaultValue){
return getSP().getLong(key, defaultValue);
}
/**
* 根据key值删除指定元素,各类型通用因为大家的key都是String
* @param key
*/
public static void deleteValue(String key){
getSP().edit().remove(key).apply();
}
/**
* 清空了,创建这个sharedpreference所有的
*/
public static void clearAll(){
getSP().edit().clear().apply();
}
/**
* 清空了,创建这个sharedpreference所有的
*/
public static boolean containsKey(String key){
getSP().edit().clear().apply();
//检查当前键是否存在
boolean isContains=getSP().contains(key);
Log.e(TAG, "containsKey: isContains= "+isContains );
//使用getAll可以返回所有可用的键值
Map<String,?> keyMap=getSP().getAll();
if (!keyMap.isEmpty()){
Set<String> keySet = keyMap.keySet();
for (String myKey: keySet){
Log.e(TAG, "containsKey: myKey= "+myKey );
}
}
return isContains;
}
public static SharedPreferences getSP(){
if (preferences == null){
preferences = BaseApplication.getContext().getSharedPreferences(SPNAME, Context.MODE_PRIVATE);
}
return preferences;
}
注意:
2.1 BaseApplication.getContext ().getSharedPreferences(SPNAME , Context.MODE_PRIVATE );
getSharedPreferences 方法传入的操作模式
Context.MODE_PRIVATE :为默认操作模式 , 代表该文件是私有数据 , 只能被应用本身访问 , 在该模式下 , 写入的内容会覆盖原文件的内容
Context.MODE_APPEND :模式会检查文件是否存在 , 存在就往文件追加内容 , 否则就创建新文件 .
特别注意: 还有两个 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 我们不需要学习了,他们 用来控制其他应用是否有权限读写该文件 , 在 Android 4.2 版本中已经被弃用
2.2 apply 和 commit 前者是异步后者是同步方法。 apply 方法时在 Android API level 9 中引入的,调用它会安全的异步写入 SharedPreference Editor , 是 当下 首选方法。
- 定义按钮的点击事件并调用这个工具类
@Override
public void onClick(View v) {
int clickId = v.getId();
if (clickId == R.id.asyncAct_putString){
SpUtil.putString("name","张三");
}else if (clickId == R.id.asyncAct_getString){
String name = SpUtil.getString("name", "无名");
String name1 = SpUtil.getString("name1", "无名");
Log.e(TAG, "getString: name= "+ name +" name1= "+name1);
}else if (clickId == R.id.asyncAct_putBoolean){
SpUtil.putBoolean("isBoy",true);
}else if (clickId == R.id.asyncAct_getBoolean){
boolean isBoy = SpUtil.getBoolean("isBoy", false);
Log.e(TAG, "getBoolean: isBoy= "+isBoy);
}else if (clickId == R.id.asyncAct_putInt){
SpUtil.putInt("age",18);
}else if (clickId == R.id.asyncAct_getInt){
int age = SpUtil.getInt("age", -1);
Log.e(TAG, "getInt: age= "+age);
}else if (clickId == R.id.asyncAct_putFloat){
SpUtil.putFloat("height",177.7F);
}else if (clickId == R.id.asyncAct_getFloat){
float height = SpUtil.getFloat("height", 0.00F);
Log.e(TAG, "getFloat: height= "+height );
}else if (clickId == R.id.asyncAct_putLong){
SpUtil.putLong("weight",70L);
}else if (clickId == R.id.asyncAct_getLong){
long weight = SpUtil.getLong("weight", 0L);
Log.e(TAG, "getLong: weight= "+weight );
}else if (clickId == R.id.asyncAct_clearAll){
SpUtil.clearAll();
} else if (clickId == R.id.asyncAct_containsKey){
SpUtil.containsKey("weight");
}
}
- 一些小提醒
- 应用程序一旦卸载或者通过手机设置页面清缓存,SharedPreference也会被删除。
- 在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。