这篇文章将为大家详细讲解有关如何在Kotlin中利用SharedPreferences对数据进行存取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
具体方法如下
/**
* author: smart
* time: 2016/10/26
* 封装好SharedPreferences 并使用 序列化和反序列化来存储数据
* 注意要在全局环境使用
*/
class Preference<T>(val context : Context,val name : String,val default : T) : ReadWriteProperty<Any?,T>{
val prefs by lazy{context.getSharedPreferences("Realnen",Context.MODE_PRIVATE)}
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return findPreference(name,default)
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
putPreference(name,value)
}
/**
* 查找数据 返回给调用方法一个具体的对象
* 如果查找不到类型就采用反序列化方法来返回类型
* default是默认对象 以防止会返回空对象的异常
* 即如果name没有查找到value 就返回默认的序列化对象,然后经过反序列化返回
*/
private fun <A> findPreference(name :String,default: A) : A = with(prefs){
val res : Any = when(default){
is Long -> getLong(name,default)
is String -> getString(name,default)
is Int -> getInt(name,default)
is Boolean -> getBoolean(name,default)
is Float -> getFloat(name,default)
else -> deSerialization(getString(name,serialize(default)))
}
res as A
}
private fun <A> putPreference(name :String,value: A) = with(prefs.edit()){
when(value){
is Long -> putLong(name,value)
is String -> putString(name,value)
is Int -> putInt(name,value)
is Boolean -> putBoolean(name,value)
is Float -> putFloat(name,value)
else -> putString(name,serialize(value))
}.apply()
}
/**
* 删除全部数据
*/
fun clearPreference(){
prefs.edit().clear().commit()
}
/**
* 根据key删除存储数据
*/
fun clearPreference(key : String){
prefs.edit().remove(key).commit()
}
/**
* 序列化对象
* @param person
* *
* @return
* *
* @throws IOException
*/
@Throws(IOException::class)
private fun<A> serialize(obj: A): String {
val byteArrayOutputStream = ByteArrayOutputStream()
val objectOutputStream = ObjectOutputStream(
byteArrayOutputStream)
objectOutputStream.writeObject(obj)
var serStr = byteArrayOutputStream.toString("ISO-8859-1")
serStr = java.net.URLEncoder.encode(serStr, "UTF-8")
objectOutputStream.close()
byteArrayOutputStream.close()
return serStr
}
/**
* 反序列化对象
* @param str
* *
* @return
* *
* @throws IOException
* *
* @throws ClassNotFoundException
*/
@Throws(IOException::class, ClassNotFoundException::class)
private fun<A> deSerialization(str: String): A {
val redStr = java.net.URLDecoder.decode(str, "UTF-8")
val byteArrayInputStream = ByteArrayInputStream(
redStr.toByteArray(charset("ISO-8859-1")))
val objectInputStream = ObjectInputStream(
byteArrayInputStream)
val obj = objectInputStream.readObject() as A
objectInputStream.close()
byteArrayInputStream.close()
return obj
}
}
这里主要用的是代理模式,还有数据类要实现序列化Serializable接口,使用方式:
var save : LoginSaveBean by Preference<LoginSaveBean>(App.getInstance(),Constant.LOCAL_SAVE_LOGIN_MODEL_KEY, LoginSaveBean("0","0"))
关于如何在Kotlin中利用SharedPreferences对数据进行存取就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。