SharedPreferences存储封装,便于开发,使用单例模式,同时使用contentProvider来获取全局上下文,所以在使用中无需传递上下文。
为了更加简单的操作(毕竟是懒人)使用了kotlin里面的委托来实现更简单的操作,此文仅用于本人记录开发经验所用。
代码如下
/**
*@author Chord.p
*@time 2019-12-31 16:08
*speak softly love
*/
class SharedHelper {
//使用contentProvider获取全局上下文
var helper : SharedPreferences = ChordProvider.mContext!!.getSharedPreferences("Config_Chord", Context.MODE_PRIVATE)
var editer: SharedPreferences.Editor = helper.edit()
companion object {
private val instance : SharedHelper by lazy { SharedHelper() }
fun <E> put(key : String,element : E) {
when (element) {
is Int -> {
instance.editer.putInt(key,element)
instance.editer.commit()
}
is String -> {
instance.editer.putString(key,element)
instance.editer.commit()
}
is Boolean -> {
instance.editer.putBoolean(key,element)
instance.editer.commit()
}
is Long -> {
instance.editer.putLong(key,element)
instance.editer.commit()
}
is Float -> {
instance.editer.putFloat(key,element)
instance.editer.commit()
}
}
}
fun <E> get(key : String,default : E) : E {
when(default) {
is Int -> {
return instance.helper.getInt(key,default) as E
}
is String -> {
return instance.helper.getString(key,default) as E
}
is Boolean -> {
return instance.helper.getBoolean(key,default) as E
}
is Long -> {
return instance.helper.getLong(key,default) as E
}
is Float -> {
return instance.helper.getFloat(key,default) as E
}
else -> {
return default
}
}
}
}
}
kotlin委托封装SharedPreferences操作代码如下
class SharedDelegation <V> (private val key: String,private val default : V) : ReadWriteProperty<Any?,V> {
override fun getValue(thisRef: Any?, property: KProperty<*>): V {
return SharedHelper.get(key,default)
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: V) {
if (null != value && null == value) {
SharedHelper.put(key,value)
}else {
SharedHelper.put(key,default)
}
}
}
使用方法如下
var test by SharedDelegation("key","default value")
另外需要说一个SharedPreferences的一个坑,SharedPreferences在存储SringSet类型的时候如果直接putStingSet然后commit的话是无法存储的,如果一定要存储StringSet的话,那么在putStingSet之后再用SharedPreferences存一个基本类型的值,比如(Int/Boolean啥的,String也可以)然后commit就可以了,如果不是必要的话,建议转成String型的存储就好了。