我的Sharedpreferences使用和一个小坑的解决
2017-01-11 本文已影响71人
Gzw丶南山
Sharedpreferences介绍
我相信大多数做Android的人都是用Sharedpreferences吧,因为我们有时候需要把一些数据存储到手机本地,Android也支持文件存储,本地数据库存储和今天说到的Sharedpreferences,我觉得开发中基本上我不太会使用到文件来存储一些数据,基本上一些复杂的多次存储的会使用数据库来存储,而一些简单的数据则会使用Sharedpreferences来存储,它就可以帮助我们,使用起来也很简单通过键值对的方式来存储数据。
接下来就看一下我的代码吧,不过我也还应该算是初级开发,若有考虑不周的地方希望看到这篇文章的大家可以指正和积极讨论。
我的SharePreferencesHelper
大家看代码就好了
/**
* SharePreferences帮助类 暂时是写了存String的 拿来给大家看一下
* Created by Gzw .
*/
public class SharePreferencesHelper {
private static final String TAG = "SharePreferencesHelper";
/**
* TagName区域
*/
public static final String USER_INFO = "user_info"; // 用户信息
public static final String DEVICE_INFO = "phone_info"; // 用户设备信息
/**
* Key区域
*/
public static final String USER_ACCOUNT = "user_account"; // USER_INFO中的用户账号
public static final String USER_PWD = "user_pwd"; // USER_INFO中的用户密码
public static final String USER_NAME = "user_name"; // USER_INFO中的用户名称
public static final String DEVICE_ID = "device_id"; // DEVICE_INFO中的设备Id 区分不同设备的唯一编号
private static final Context CONTEXT = MyApplication.getContext(); // 上下文对象
/**
* 用Sp存String类型数据
*
* @param key 键 如:USER_ACCOUNT
* @param value 值 如:获取到的用户账号
* @param tagName 存到那个Sp中 如:用户账号密码存到用户信息中
*/
public static void putString(String key, String value, String tagName) {
SharedPreferences sp = getSharePreferences(tagName);
if (sp != null) {
SharedPreferences.Editor editor = sp.edit();
editor.putString(key, value);
editor.commit();
}
}
/**
* 获取对应的TagName的SharedPreferences
*
* @param tagName
* @return
*/
private static SharedPreferences getSharePreferences(String tagName) {
return CONTEXT.getSharedPreferences(tagName, Context.MODE_PRIVATE);
}
/**
* 获取存储的Sting
*
* @param key 存的时候的键 如:USER_ACCOUNT
* @param tagName 是哪个部分 如:USER_INFO
* @return 返回获取的到值, 默认值为"" (如果有需要修改 后面可以重载一个自定义默认值的方法)
*/
public static String getString(String key, String tagName) {
SharedPreferences sp = getSharePreferences(tagName);
return sp.getString(key, "");
}
/**
* 快速获取用户姓名
* 举例的方法, 比如我项目中需要频繁的拿到用户姓名, 可以直接将其封装快速使用
* @return
*/
public static String getUserName() {
String userName = getString(USER_NAME, USER_INFO);
return userName;
}
/**
* 清除对应部分的存过的数据
* 我之前遇到过版本升级清除已经存储的账号密码
*
* @param tagName 对应部分 如:USER_INFO中的所有储存的内容
*/
public static void cleanSpWithName(String tagName) {
SharedPreferences sp = getSharePreferences(tagName);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
editor.commit();
}
}
我基本上都是这么使用的,其实很简单的只是会用SharePreferences就可以看懂了,不过原谅我是个强迫症所以我的变量名的注释都会对齐的。
中途遇到的一个小坑
本来一开始我的clean方法是这么写的大家可以看到区别的吧?一个是先获取一个Editor然后进行操作,另一个是操作时才获取Editor,而SharedPreferences的edit()的返回说明是返回SharedPreferences.Editor接口的新实例,允许您修改此SharedPreferences对象中的值。就是每次调用一次edit()返回的对象都是不一样的(我还特意打印了地址出来观察),而这种修改操作要在一个Editor上操作才有效,嗯就是这样。
/**
* 清除对应部分的存过的数据
* 我之前遇到过版本升级清除已经存储的账号密码
*
* @param tagName 对应部分 如:USER_INFO中的所有储存的内容
*/
public static void cleanSpWithName(String tagName) {
SharedPreferences sp = getSharePreferences(tagName);
// 这里有不一样
sp.editor.clear();
sp.editor.commit();
}
补充
Android7.0新的删除方法一行就搞定了
/**
* 清除对应部分的存过的数据
* 我之前遇到过版本升级清除已经存储的账号密码
*
* @param tagName 对应部分 如:USER_INFO中的所有储存的内容
*/
@RequiresApi(api = Build.VERSION_CODES.N)
public static void cleanSpWithName(String tagName) {
// Android7.0新的删除方法
CONTEXT.deleteSharedPreferences(tagName);
}
我希望可以站在初学者&自学者的角度把Android中的知识点很清楚的介绍给大家,希望大家喜欢。 如果有错误希望指出来,有问题或者没看懂,都可以来问我的