SharedPreferences工具类

来源:互联网 发布:算法及其描述 2 1 编辑:程序博客网 时间:2024/05/15 07:48

作为保存数据的一种方式,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 = dandy05-19 18:16:10.034 22817-22817/? I/MainActivity_share: age = 2805-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 = dandy05-19 18:20:06.774 23671-23671/? I/MainActivity_share: age = 28
在这个结果中,你并没有看到key为sex的打印信息,那是因为,你传入的第二个参数类型是Boolean类型的,但是此类型并没有存入key=sex的数据,所以结果是导致应用报了ClassCastException的异常,因此看出了泛型方法中,事先填入数据类型的重要性。
下面看一下,填入数据类型的效果呢,



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

大体就先这样了,希望方便!




0 0
原创粉丝点击