SharedPreferences工具类

作为保存数据的一种方式,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的异常,因此看出了泛型方法中,事先填入数据类型的重要性。
下面看一下,填入数据类型的效果呢,



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

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




你可能感兴趣的:(android)