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"))

注意 这条语句我们要放在全局变量来读取,当你改变值或者值被改变时,这里的值会自己提交和同步。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,下面是 Kotlin 中使用 SharedPreferences 存储注册登录信息的代码示例: 首先,在注册页面中,我们可以使用如下代码将用户输入的用户名和密码保存到 SharedPreferences 中: ```kotlin // 获取 SharedPreferences 实例 val sharedPreferences = getSharedPreferences("my_preferences", Context.MODE_PRIVATE) // 获取用户名和密码输入框中的值 val username = usernameEditText.text.toString() val password = passwordEditText.text.toString() // 使用 SharedPreferences.Editor 将用户名和密码保存到 SharedPreferences 中 val editor = sharedPreferences.edit() editor.putString("username", username) editor.putString("password", password) editor.apply() ``` 接着,在登录页面中,我们可以使用如下代码从 SharedPreferences 中读取保存的用户名和密码,并与用户输入的用户名和密码进行比较: ```kotlin // 获取 SharedPreferences 实例 val sharedPreferences = getSharedPreferences("my_preferences", Context.MODE_PRIVATE) // 获取用户名和密码输入框中的值 val username = usernameEditText.text.toString() val password = passwordEditText.text.toString() // 从 SharedPreferences 中获取保存的用户名和密码 val savedUsername = sharedPreferences.getString("username", "") val savedPassword = sharedPreferences.getString("password", "") // 比较用户输入的用户名和密码与保存的用户名和密码是否一致 if (username == savedUsername && password == savedPassword) { // 登录成功 } else { // 登录失败 } ``` 以上代码中,我们将 SharedPreferences 的名称指定为 "my_preferences",可以根据实际情况修改。另外,我们使用 SharedPreferences.Editor 的 apply() 方法将修改提交到 SharedPreferences 中。apply() 方法是异步的,不会阻塞当前线程,所以比较适合在 UI 线程中使用。如果需要同步提交修改,可以使用 commit() 方法,但建议不要在 UI 线程中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值