Convert SharePreferences Android sang kotlin
Những gì cần tìm hiểu đã có hết trong bài viết này rồi: https://viblo.asia/p/toi-uu-android-shared-preferences-924lJM8bZPM Hôm nay mình sẽ mạn phép dùng bài viết của tác giả ở trên để hướng dẫn các bạn convert SharePreferences của Android sang Kotlin 1.1. Phần khởi tạo SharedPrefs companion ...
Những gì cần tìm hiểu đã có hết trong bài viết này rồi:
https://viblo.asia/p/toi-uu-android-shared-preferences-924lJM8bZPM
Hôm nay mình sẽ mạn phép dùng bài viết của tác giả ở trên để hướng dẫn các bạn convert SharePreferences của Android sang Kotlin
1.1. Phần khởi tạo SharedPrefs
companion object { private val PREFS_NAME = "share_prefs" private var mInstance: SharedPrefs? = null val instance: SharedPrefs get() { if (mInstance == null) { mInstance = SharedPrefs() } return mInstance as SharedPrefs } }
1.2. Put data vào shared preferences
Cần truyền vào key và gía trị vào -> function sẽ check type data và put vào đúng type
fun <T> put(key: String, data: T) { val editor = mSharedPreferences.edit() when (data) { is String -> editor.putString(key, data as String) is Boolean -> editor.putBoolean(key, data as Boolean) is Float -> editor.putFloat(key, data as Float) is Int -> editor.putInt(key, data as Int) is Long -> editor.putLong(key, data as Long) else -> editor.putString(key, App.self()?.gSon?.toJson(data)) } editor.apply() }
1.3. Get data từ shared preferencesype
- Cần truyền vào key và type class vào -> function sẽ check type class và get ra đúng giá trị
- Có 2 cách get data ra là get có giá trị mặc định được truyền vào và get có giá trị mặc định sẵn
@Suppress("UNCHECKED_CAST") operator fun <T> get(key: String, anonymousClass: Class<T>): T { return when (anonymousClass) { String::class.java -> mSharedPreferences.getString(key, "") as T Boolean::class.java -> java.lang.Boolean.valueOf(mSharedPreferences.getBoolean(key, false)) as T Float::class.java -> java.lang.Float.valueOf(mSharedPreferences.getFloat(key, 0f)) as T Int::class.java -> Integer.valueOf(mSharedPreferences.getInt(key, 0)) as T Long::class.java -> java.lang.Long.valueOf(mSharedPreferences.getLong(key, 0)) as T else -> App.self()?.gSon?.fromJson(mSharedPreferences.getString(key, ""), anonymousClass)!! } } @Suppress("UNCHECKED_CAST") operator fun <T> get(key: String, anonymousClass: Class<T>, defaultValue: T): T { return when (anonymousClass) { String::class.java -> mSharedPreferences.getString(key, defaultValue as String) as T Boolean::class.java -> java.lang.Boolean.valueOf(mSharedPreferences.getBoolean(key, defaultValue as Boolean)) as T Float::class.java -> java.lang.Float.valueOf(mSharedPreferences.getFloat(key, defaultValue as Float)) as T Int::class.java -> Integer.valueOf(mSharedPreferences.getInt(key, defaultValue as Int)) as T Long::class.java -> java.lang.Long.valueOf(mSharedPreferences.getLong(key, defaultValue as Long)) as T else -> App.self()?.gSon?.fromJson(mSharedPreferences.getString(key, ""), anonymousClass)!! } }
Full code :
class SharedPrefs private constructor() { private val mSharedPreferences: SharedPreferences init { mSharedPreferences = App.self()!!.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) } @Suppress("UNCHECKED_CAST") operator fun <T> get(key: String, anonymousClass: Class<T>): T { return when (anonymousClass) { String::class.java -> mSharedPreferences.getString(key, "") as T Boolean::class.java -> java.lang.Boolean.valueOf(mSharedPreferences.getBoolean(key, false)) as T Float::class.java -> java.lang.Float.valueOf(mSharedPreferences.getFloat(key, 0f)) as T Int::class.java -> Integer.valueOf(mSharedPreferences.getInt(key, 0)) as T Long::class.java -> java.lang.Long.valueOf(mSharedPreferences.getLong(key, 0)) as T else -> App.self()?.gSon?.fromJson(mSharedPreferences.getString(key, ""), anonymousClass)!! } } @Suppress("UNCHECKED_CAST") operator fun <T> get(key: String, anonymousClass: Class<T>, defaultValue: T): T { return when (anonymousClass) { String::class.java -> mSharedPreferences.getString(key, defaultValue as String) as T Boolean::class.java -> java.lang.Boolean.valueOf(mSharedPreferences.getBoolean(key, defaultValue as Boolean)) as T Float::class.java -> java.lang.Float.valueOf(mSharedPreferences.getFloat(key, defaultValue as Float)) as T Int::class.java -> Integer.valueOf(mSharedPreferences.getInt(key, defaultValue as Int)) as T Long::class.java -> java.lang.Long.valueOf(mSharedPreferences.getLong(key, defaultValue as Long)) as T else -> App.self()?.gSon?.fromJson(mSharedPreferences.getString(key, ""), anonymousClass)!! } } fun <T> put(key: String, data: T) { val editor = mSharedPreferences.edit() when (data) { is String -> editor.putString(key, data as String) is Boolean -> editor.putBoolean(key, data as Boolean) is Float -> editor.putFloat(key, data as Float) is Int -> editor.putInt(key, data as Int) is Long -> editor.putLong(key, data as Long) else -> editor.putString(key, App.self()?.gSon?.toJson(data)) } editor.apply() } fun clear() { mSharedPreferences.edit().clear().apply() } companion object { private val PREFS_NAME = "share_prefs" private var mInstance: SharedPrefs? = null val instance: SharedPrefs get() { if (mInstance == null) { mInstance = SharedPrefs() } return mInstance as SharedPrefs } }
class App : Application() { var gSon: Gson? = null override fun onCreate() { super.onCreate() mSelf = this gSon = Gson() } companion object { private var mSelf: App? = null fun self(): App? { return mSelf } } }
và chú ý khai báo trong AndroidManifest nhé
android:name=".App"
cũng như import thư viện gson trong build.gradle của app nữa nhé
implementation 'com.google.code.gson:gson:2.8.2'
3.1. Tạo model Employee
Kotlin hỗ trợ chúng ta rất nhiều trong việc loại bỏ các hàm get set như trong java cũ
class Employee(var id: Long, var name: String?) { override fun toString(): String { return "Employee {" + "id = " + id + ", name = '" + name + ' + '}' } }
3.2. MainActivity
class MainActivity : AppCompatActivity() { private val tag = this@MainActivity.javaClass.name!! private val firstStaff = "first_staff" private val secondStaff = "second_staff" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val employee = Employee(1, "Nguyen Viet Manh") val employee2 = Employee(2, "Do Xuan Duc") SharedPrefs.instance.put(firstStaff, employee) SharedPrefs.instance.put(secondStaff, employee2) Log.e(tag, SharedPrefs.instance[firstStaff, Employee::class.java].toString()) Log.e(tag, SharedPrefs.instance[secondStaff, Employee::class.java].toString()) Log.e(tag, SharedPrefs.instance["hello", Int::class.java, 2].toString()) } }
https://viblo.asia/p/toi-uu-android-shared-preferences-924lJM8bZPM