How do you save/store objects in SharedPreferences on Android?

后端 未结 20 2733
野趣味
野趣味 2020-11-22 13:35

I need to get user objects in many places, which contain many fields. After login, I want to save/store these user objects. How can we implement this kind of scenario?

<
20条回答
  •  情书的邮戳
    2020-11-22 14:24

    Using Delegation Kotlin we can easily put and get data from shared preferences.

        inline fun  Context.sharedPrefs(key: String) = object : ReadWriteProperty {
    
            val sharedPrefs by lazy { this@sharedPrefs.getSharedPreferences("APP_DATA", Context.MODE_PRIVATE) }
            val gson by lazy { Gson() }
            var newData: T = (T::class.java).newInstance()
    
            override fun getValue(thisRef: Any?, property: KProperty<*>): T {
                return getPrefs()
            }
    
            override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
                this.newData = value
                putPrefs(newData)
            }
    
            fun putPrefs(value: T?) {
                sharedPrefs.edit {
                    when (value) {
                        is Int -> putInt(key, value)
                        is Boolean -> putBoolean(key, value)
                        is String -> putString(key, value)
                        is Long -> putLong(key, value)
                        is Float -> putFloat(key, value)
                        is Parcelable -> putString(key, gson.toJson(value))
                        else          -> throw Throwable("no such type exist to put data")
                    }
                }
            }
    
            fun getPrefs(): T {
                return when (newData) {
                           is Int -> sharedPrefs.getInt(key, 0) as T
                           is Boolean -> sharedPrefs.getBoolean(key, false) as T
                           is String -> sharedPrefs.getString(key, "") as T ?: "" as T
                           is Long -> sharedPrefs.getLong(key, 0L) as T
                           is Float -> sharedPrefs.getFloat(key, 0.0f) as T
                           is Parcelable -> gson.fromJson(sharedPrefs.getString(key, "") ?: "", T::class.java)
                           else          -> throw Throwable("no such type exist to put data")
                       } ?: newData
            }
    
        }
    
        //use this delegation in activity and fragment in following way
            var ourData by sharedPrefs("otherDatas")
    

提交回复
热议问题