最近有点懒了,虽然工作不太忙,但是也没去写东西了,进入新的月份了,不能继续懒惰了,奋斗吧,骚年!
今天来分享一个关于SharedPreferences的使用技巧,SharedPreferences是Android提供的一个轻量级的数据存储类,我们可以利用它的api来存储一些简单的配置信息。关于SharedPreferences的基本用法,网上有很多,我这里就不做说明了,如果有不懂的请自行百度或者谷歌相关资料,进行学习,今天我要讲的是关于SharedPreferences的封装。我们平时的开发中肯定是不止一次的会用到SharedPreferences这个类来保存一些信息,所以如果每次都按照基本方法写一遍,代码冗余量太大,所以我们应该将它的相关操作封装起来,不仅简化代码,也方便统一管理。我这里的基本思路是采用单例模式,提供一个管理类SPManager.java,采用公共静态方法的形式将相关的put和get操作都封装到该类里面,外部直接通过类名.方法名的方式进行调用,下面来看具体代码:
一、既然是单例模式,那么老规矩三段式:
1、创建私有的静态的本类对象,即当前类的实例:
//创建当前类的实例
private static SPManager mInstance;
private static SharedPreferences sp;
private static SharedPreferences.Editor editor;
2、创建私有的构造方法,在方法里我们拿到sp对象,并通过sp对象拿到editor对象:
//私有的构造
private SPManager() {
sp = BaseApplication.getContext()
.getSharedPreferences(SHARE_PREFERENCE_NAME,
Context.MODE_PRIVATE);
editor = sp.edit();
}
这里补充说明一下获取sp对象时传入的两个参数,第一个参数是我们自己定义的配置文件名称,第二个是数据的操作模式,这里定义为私有模式:
//文件名
private static final String SHARE_PREFERENCE_NAME = "zdjfu.pre";
3、创建公共的静态的返回本类对象的方法:
//线程安全的返回本类对象的方法
public static SPManager getInstance() {
if (mInstance == null) {
synchronized (SPManager.class) {
if (mInstance == null) {
mInstance = new SPManager();
}
}
}
return mInstance;
}
二、接下来是一系列的put和get操作,就是写入和获取不同数据类型的数据,这里我用int类型数据来做个示例,完整代码会在文章末尾为大家附上:
//对int类型数据的写入
public void putInt(String key, int value) {
editor.putInt(key, value);
editor.commit();
}
//对int类型数据的读取
public int getInt(String key, int defaultValue) {
return sp.getInt(key, defaultValue);
}
按照不同数据类型分别创建相应的方法即可完成数据的读写操作。
三、完成以上操作之后,就是我们的使用了,下面来说说如何使用,这里也是举个实例给大家,我这里要存储一个String类型的数据,那么我首先在类中定义了一个key,用来标识这次的数据存储操作,代码如下:
//设备Token
public static final String DEVICE_TOKEN = "device_token";
接着在需要保存数据的地方,调用SPManager中的putString方法,按照key-value的形式将数据保存即可,代码如下:
//将设备token存储到sp中
SPManager.getInstance().putString(SPManager.DEVICE_TOKEN, device_token);
可以看到传入了两个参数,前面的是我们定义的key,后面的是我们要保存的数据值,这样我们就完成了数据存储操作。
当我们需要用到之前保存的数据时,我们只要调用getString方法即可,代码如下:
//读取保存的设备Token信息
LogUtil.e("archie", SPManager.getInstance()
.getString(SPManager.DEVICE_TOKEN,""));
这样我们就完成了数据的读写操作,通过我们的封装,使得代码更简洁,并且更具有可读性了,实现的原理本质上是一样的。
下面附上SPManager.java的源码:
package com.zdjfu.android.database;
import android.content.Context;
import android.content.SharedPreferences;
import com.zdjfu.android.application.BaseApplication;
/**
* 项目名: ZDJFUProject
* 包名: com.zdjfu.android.database
* 文件名: SPManager
* 创建者: Jarchie
* 创建时间: 17/5/29 下午4:27
* 描述: 配置文件工具类
*/
public class SPManager {
//创建当前类的实例
private static SPManager mInstance;
private static SharedPreferences sp;
private static SharedPreferences.Editor editor;
//文件名
private static final String SHARE_PREFERENCE_NAME = "zdjfu.pre";
//设备Token
public static final String DEVICE_TOKEN = "device_token";
//注册设备Token
public static final String REGISTER_TOKEN = "is_um_register";
//线程安全的返回本类对象的方法
public static SPManager getInstance() {
if (mInstance == null) {
synchronized (SPManager.class) {
if (mInstance == null) {
mInstance = new SPManager();
}
}
}
return mInstance;
}
//私有的构造
private SPManager() {
sp = BaseApplication.getContext()
.getSharedPreferences(SHARE_PREFERENCE_NAME,
Context.MODE_PRIVATE);
editor = sp.edit();
}
//对int类型数据的写入
public void putInt(String key, int value) {
editor.putInt(key, value);
editor.commit();
}
//对int类型数据的读取
public int getInt(String key, int defaultValue) {
return sp.getInt(key, defaultValue);
}
//对long类型数据的写入
public void putLong(String key, Long value) {
editor.putLong(key, value);
editor.commit();
}
//对long类型数据的读取
public long getLong(String key, int defaultValue) {
return sp.getLong(key, defaultValue);
}
//对string类型数据的写入
public void putString(String key, String value) {
editor.putString(key, value);
editor.commit();
}
//对string类型数据的读取
public String getString(String key, String defaultValue) {
return sp.getString(key, defaultValue);
}
//对float类型数据的写入
public void putFloat(String key, float value) {
editor.putFloat(key, value);
editor.commit();
}
//对float类型数据的读取
public float getFloat(String key, float defaultValue) {
return sp.getFloat(key, defaultValue);
}
//对boolean类型数据的写入
public void putBoolean(String key, boolean value) {
editor.putBoolean(key, value);
editor.commit();
}
//对boolean类型数据的读取
public boolean getBoolean(String key, boolean defaultValue) {
return sp.getBoolean(key, defaultValue);
}
//判断key是否存在
public boolean isKeyExist(String key) {
return sp.contains(key);
}
//删除单个数据,按照key类型
public void remove(String key) {
editor.remove(key);
editor.commit();
}
//删除所有数据
public void removeAllSPData() {
editor.clear().commit();
}
}
写的比较仓促,有不对的地方欢迎朋友们批评指正!