您的位置:首页 > Web前端

SharedPreferences工具类

2016-05-19 18:27 363 查看
作为保存数据的一种方式,SharedPreferences,我们经常都会用到的,它的保存路径在data/data/你的包名/shared_prefs/保存的文件名.xml, 使用方法也很简单。so,写了一个简单的工具类,方便以后直接拷贝使用,如下

package com.lingyun.lingyunworkspaces;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;

/**
* Created by dandy on 2016/5/19.
*/

public class SharedPreferencesUtils {

private static SharedPreferencesUtils instance;

private static final String DEFAULT_NAME = "dandy.xml";

private String name = DEFAULT_NAME;

private Context mContext;

public static SharedPreferencesUtils getInstance(){
if(instance == null){
synchronized (SharedPreferencesUtils.class){
if(instance == null){
instance = new SharedPreferencesUtils();
}
}
}
return instance;
}

/**
* 初始化上下文参数以及文件名
* @param context,上下文
* @param name,文件名
*/
public void init(Context context,String name){
this.mContext = context.getApplicationContext();
this.name = name;
}

/**
* 保存数据,泛型方法
* @param key,键值
* @param value,数据
* @param <V>
*/
public <V> void setValue(@NonNull String key,V value){
SharedPreferences sp = mContext.getSharedPreferences(name,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if(value instanceof String){
editor.putString(key,(String)value);
}else if(value instanceof Integer){
editor.putInt(key,(Integer)value);
}else if(value instanceof Long){
editor.putLong(key,(Long)value);
}else if(value instanceof Boolean){
editor.putBoolean(key,(Boolean)value);
}else if(value instanceof Float){
editor.putFloat(key,(Float)value);
}
editor.commit();
}

/**
* 读取数据,泛型方法
* @param key,键值
* @param defaultValue,默认值
* @param <V>
* @return
*/

public <V> V getValue(@NonNull String key,V defaultValue){
SharedPreferences sp = mContext.getSharedPreferences(name,Context.MODE_PRIVATE);
Object value = defaultValue;
if(defaultValue instanceof String){
value = sp.getString(key,(String)defaultValue);
}else if(defaultValue instanceof Integer){
value = sp.getInt(key,(Integer) defaultValue);
}else if(defaultValue instanceof Long){
value = sp.getLong(key,(Long) defaultValue);
}else if(defaultValue instanceof Boolean){
value = sp.getBoolean(key, (Boolean) defaultValue);
}else if(defaultValue instanceof Float){
value = sp.getFloat(key, (Float) defaultValue);
}
return (V)value;
}

/**
* 清除数据
*/
public void clearData(){
SharedPreferences.Editor editor = mContext.getSharedPreferences(name,Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
}
}


使用也很简单,首先,你需要初始化一下,如下

SharedPreferencesUtils.getInstance().init(this,"dandy.xml");
下面数据保存

SharedPreferencesUtils.getInstance().<String>setValue("name", "dandy");
SharedPreferencesUtils.getInstance().<Integer>setValue("age", 28);
SharedPreferencesUtils.getInstance().setValue("sex", "male");
你会发现,第三个与前两个的使用方式不太一样,源码中有说明,因为方法都是泛型的,前面2种直接指定了数据类型,所以在第二个参数填写的数据类型与指定的类型不符合时,会报错指示,而最后一个没有指定类型,所以第二个参数可以是任何类型,但是,既然方法是泛型的,建议使用前2种的方式,指定数据类型。

接下来是获取数据并打印,

Log.i(TAG, "name = " + SharedPreferencesUtils.getInstance().<String>getValue( "name", "tabolt"));
Log.i(TAG, "age = "+SharedPreferencesUtils.getInstance().<Integer>getValue("age", 26));
Log.i(TAG, "sex = "+SharedPreferencesUtils.getInstance().getValue("sex", "female"));
调用的方式与保存的方式是匹配的,所以在此不再做过多说明。

输出结果:
05-19 18:16:10.034 22817-22817/? I/MainActivity_share: name = dandy
05-19 18:16:10.034 22817-22817/? I/MainActivity_share: age = 28
05-19 18:16:10.034 22817-22817/? I/MainActivity_share: sex = male
最后再看一下,若是key = sex的,在没有指定数据类型的时候,传入了错误的默认数值,会是神马结果呢,稍作修改如下:

Log.i(TAG, "name = " + SharedPreferencesUtils.getInstance().<String>getValue( "name", "tabolt"));
Log.i(TAG, "age = "+SharedPreferencesUtils.getInstance().<Integer>getValue("age", 26));
Log.i(TAG, "sex = "+SharedPreferencesUtils.getInstance().getValue("sex", true));
可以看出,代码并没有提示什么错误信息,下面看一下输出结果,

输出结果:
05-19 18:20:06.774 23671-23671/? I/MainActivity_share: name = dandy
05-19 18:20:06.774 23671-23671/? I/MainActivity_share: age = 28
在这个结果中,你并没有看到key为sex的打印信息,那是因为,你传入的第二个参数类型是Boolean类型的,但是此类型并没有存入key=sex的数据,所以结果是导致应用报了ClassCastException的异常,因此看出了泛型方法中,事先填入数据类型的重要性。

下面看一下,填入数据类型的效果呢,



很明显啊 ,第二个参数类型与之不符,所以报错了。

大体就先这样了,希望方便!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: