作为保存数据的一种方式,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的异常,因此看出了泛型方法中,事先填入数据类型的重要性。
很明显啊 ,第二个参数类型与之不符,所以报错了。
大体就先这样了,希望方便!