Kotlin-SharedPreferences工具类

使用到SharedPreferences、Gson、内联函数、泛型、reified. implementation “com.google.code.gson:gson:$google_gson” google_gson = 2.8.5
object SpHelper {
          
   
    val sp: SharedPreferences by lazy {
          
   
        ContextUtil.getAppContext().getSharedPreferences("default", Context.MODE_PRIVATE)
    }

    fun put(@NotNull key: String, @NotNull value: Any) = with(sp.edit()) {
          
   
        when (value) {
          
   
            is Long -> putLong(key, value)
            is String -> putString(key, value)
            is Int -> putInt(key, value)
            is Boolean -> putBoolean(key, value)
            is Float -> putFloat(key, value)
            else -> putString(key, GsonUtil.toJson(value))
        }.apply()
    }

    fun find(@NotNull key: String): Boolean {
          
   
        return sp.contains(key)
    }

    /**
     * 内联函数使用的方法和属性的权限修饰符必须是public
     * */
    inline fun <reified T> get(@NotNull key: String, default: T): T {
          
   
        if (!find(key)) return default;
        return with(sp) {
          
   
            when (default) {
          
   
                is Int -> getInt(key, default) as T
                is Long -> getLong(key, default) as T
                is Float -> getFloat(key, default) as T
                is Boolean -> getBoolean(key, default) as T
                is String -> getString(key, default) as T
                else -> GsonUtil.fromJson2Object(getString(key, ""), T::class.java)
            }
        }
    }

    fun remove(@NotNull key: String): Boolean {
          
   
        if (!find(key)) return true
        sp.edit().remove(key).apply()
        return true
    }

    fun clear() {
          
   
        sp.edit().clear().apply()
    }
}
object GsonUtil {
          
   
    private val gson: Gson by lazy {
          
   
        GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss").create()
    }
    private val prettyGson: Gson by lazy {
          
   
        GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")
            .setPrettyPrinting()
            .create()
    }

    /**
     * 小写下划线的格式解析JSON字符串到对象
     *
     * 例如 is_success->isSuccess
     *
     * @param json
     * @param classOfT
     * @return
     */
    fun <T> fromJsonUnderScoreStyle(json: String?, classOfT: Class<T>?): T {
          
   
        return gson.fromJson(json, classOfT)
    }

    /**
     * JSON字符串转为Map<String></String>,String>
     *
     * @param json
     * @return
     */
    fun <T> json2Map(json: String?): T {
          
   
        return gson.fromJson(json, object : TypeToken<Map<String?, String?>?>() {
          
   }.type)
    }

    /**
     * 小写下划线的格式将对象转换成JSON字符串
     *
     * @param src
     * @return
     */
    fun toJson(src: Any?): String {
          
   
        return gson.toJson(src)
    }

    fun toJson(src: Any?, writer: Appendable?) {
          
   
        gson.toJson(src, writer)
    }

    fun toPrettyString(src: Any?): String {
          
   
        return prettyGson.toJson(src)
    }

    fun <T> fromJson2Object(src: String?, t: Class<T>?): T {
          
   
        return gson.fromJson(src, t)
    }

    fun <T> fromJson2Object(src: String?, typeOfT: Type?): T {
          
   
        return gson.fromJson(src, typeOfT)
    }

    fun <T> fromJson2Object(reader: Reader?, typeOfT: Type?): T {
          
   
        return gson.fromJson(reader, typeOfT)
    }

    fun <T> fromJson2Object(reader: Reader?, t: Class<T>?): T {
          
   
        return gson.fromJson(reader, t)
    }
}

调用

private fun getUserInfoFromLocal(): UserInfo {
          
   
        return SpHelper.get(ConstPool.SP_USER_INFO,UserInfo())
    }

    fun saveUserInfoToLocal(data: UserInfo) {
          
   
        SpHelper.put(ConstPool.SP_USER_INFO,data)
    }
经验分享 程序员 微信小程序 职场和发展