AndroidMobile Programming

Android SharedPreferences Kotlin

Android SharedPreferences – Dalam artikel yang satu ini, Kita akan mempelajari praktik terbaik SharedPreferences di Android (Kotlin). Saya akan menunjukkan kepada Anda, bagaimana kami dapat menyimpan dan mengambil nilai di SharedPreferences. Untuk pemahaman yang lebih baik, saya akan membuat contoh SharedPreferences android (Aplikasi contoh) dan mengambil contoh Nilai Menulis dan Membaca di SharedPreferences. Jadi mari kita mulai

Apa itu Android SharedPreferences?

SharedPreferences adalah Android API yang menyimpan data aplikasi menggunakan pasangan nilai kunci dan menyediakan metode sederhana untuk membaca dan menulisnya.

Sistem Android menyediakan beberapa pilihan bagi Anda untuk menyimpan data Anda . Opsi ini  adalah  Penyimpanan khusus aplikasi ,  Penyimpanan bersama ,  Preferensi ,  Basis data . SharedPreferences hadir dalam  Preference . Ini menawarkan kerangka kerja untuk menyimpan data pribadi dan primitif dalam pasangan nilai kunci.

Mengapa SharedPreferences?

Mereka sebagian besar digunakan untuk menyimpan status pengguna ketika menyangkut pengaturan pengguna atau menyimpan sepotong informasi kecil (Detail pengguna, dll.) Tanpa memerlukan izin penyimpanan. Menurut pendapat saya, Anda harus menyimpan nilai primitif kecil di  Preferensi  seperti boolean, int, long, float, dan string.

Untuk lebih memahaminya, kamu bisa lihat di artikel berikut ini

Contoh SharedPreferences Android di Kotlin

1. Buat proyek aplikasi android baru

Mari kita ambil contoh untuk Android SharedPreferences , buka android studio, dan buat proyek baru. Sekarang buat antarmuka bernama IPreferenceHelper. Dalam Antarmuka ini kami mendefinisikan beberapa setter pengambil untuk menyimpan atau mengambil nilai preferensi. seperti ApiKey dan UserId dll.

package com.sharedpreferencesexample
interface IPreferenceHelper {
    fun setApiKey(apiKey: String)
    fun getApiKey(): String
    fun setUserId(userId: String)
    fun getUserId(): String
    fun clearPrefs()
}

2. Buat kelas tunggal untuk mengelola Preferensi

Idealnya SharedPreferences menyimpan nilai level aplikasi, Jadi instance SharedPreferences harus membuang aplikasinya sendiri. Ini harus menjadi lajang. Mari buat kelas Singletone bernama PreferenceManager dan implementasikan IPreferenceHelper. Sama seperti di bawah ini

open class PreferenceManager constructor(context: Context) : IPreferenceHelper {
    private val PREFS_NAME = "SharedPreferenceDemo"
    private var preferences: SharedPreferences

    init {
        preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
    }

    override fun setApiKey(apiKey: String) {
        preferences[API_KEY] = apiKey
    }

    override fun getApiKey(): String {
        return preferences[API_KEY] ?: ""
    }

    override fun setUserId(userId: String) {
        preferences[USER_ID] = userId
    }

    override fun getUserId(): String {
        return preferences[USER_ID] ?: ""
    }

    override fun clearPrefs() {
        preferences.edit().clear().apply()
    }

    companion object {
        const val API_KEY = "api_key"
        const val USER_ID = "user_id"
    }
}

3.  Tulis di SharedPreferences Anda

Biasanya, menulis ke  SharedPreferences  sederhana. Tapi saya akan menulis ekstensi Kotlin, Ekstensi ini membuat penulisan menjadi sangat sederhana dan mengurangi kode boilerplate.

/**
 * SharedPreferences extension function, to listen the edit() and apply() fun calls
 * on every SharedPreferences operation.
 */
private inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) {
    val editor = this.edit()
    operation(editor)
    editor.apply()
}

/**
 * puts a key value pair in shared prefs if doesn't exists, otherwise updates value on given [key]
 */
private operator fun SharedPreferences.set(key: String, value: Any?) {
    when (value) {
        is String? -> edit { it.putString(key, value) }
        is Int -> edit { it.putInt(key, value) }
        is Boolean -> edit { it.putBoolean(key, value) }
        is Float -> edit { it.putFloat(key, value) }
        is Long -> edit { it.putLong(key, value) }
        else -> throw UnsupportedOperationException("Not yet implemented")
    }
}

4. Baca dari SharedPreferences

Membaca nilai dari SharedPreferences juga mudah. Saya akan menulis ekstensi berguna lainnya yang memberikan kontrol lebih besar untuk mengambil nilai dari SharedPreferences. Mari periksa kode di bawah ini

/**
 * finds value on given key.
 * [T] is the type of value
 * @param defaultValue optional default value - will take null for strings, false for bool and -1 for numeric values if [defaultValue] is not specified
 */
private inline operator fun <reified T : Any> SharedPreferences.get(
    key: String,
    defaultValue: T? = null
): T? {
    return when (T::class) {
        String::class -> getString(key, defaultValue as? String) as T?
        Int::class -> getInt(key, defaultValue as? Int ?: -1) as T?
        Boolean::class -> getBoolean(key, defaultValue as? Boolean ?: false) as T?
        Float::class -> getFloat(key, defaultValue as? Float ?: -1f) as T?
        Long::class -> getLong(key, defaultValue as? Long ?: -1) as T?
        else -> throw UnsupportedOperationException("Not yet implemented")
    }
}

5. Akhirnya kelas PreferenceManager Anda terlihat seperti di bawah ini

package com.sharedpreferencesexample

import android.content.Context
import android.content.SharedPreferences

open class PreferenceManager constructor(context: Context) : IPreferenceHelper {
    private val PREFS_NAME = "SharedPreferenceDemo"
    private var preferences: SharedPreferences

    init {
        preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
    }

    override fun setApiKey(apiKey: String) {
        preferences[API_KEY] = apiKey
    }

    override fun getApiKey(): String {
        return preferences[API_KEY] ?: ""
    }

    override fun setUserId(userId: String) {
        preferences[USER_ID] = userId
    }

    override fun getUserId(): String {
        return preferences[USER_ID] ?: ""
    }

    override fun clearPrefs() {
        preferences.edit().clear().apply()
    }

    companion object {
        const val API_KEY = "api_key"
        const val USER_ID = "user_id"
    }
}


/**
 * SharedPreferences extension function, to listen the edit() and apply() fun calls
 * on every SharedPreferences operation.
 */
private inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) {
    val editor = this.edit()
    operation(editor)
    editor.apply()
}

/**
 * puts a key value pair in shared prefs if doesn't exists, otherwise updates value on given [key]
 */
private operator fun SharedPreferences.set(key: String, value: Any?) {
    when (value) {
        is String? -> edit { it.putString(key, value) }
        is Int -> edit { it.putInt(key, value) }
        is Boolean -> edit { it.putBoolean(key, value) }
        is Float -> edit { it.putFloat(key, value) }
        is Long -> edit { it.putLong(key, value) }
        else -> throw UnsupportedOperationException("Not yet implemented")
    }
}

/**
 * finds value on given key.
 * [T] is the type of value
 * @param defaultValue optional default value - will take null for strings, false for bool and -1 for numeric values if [defaultValue] is not specified
 */
private inline operator fun <reified T : Any> SharedPreferences.get(
    key: String,
    defaultValue: T? = null
): T? {
    return when (T::class) {
        String::class -> getString(key, defaultValue as? String) as T?
        Int::class -> getInt(key, defaultValue as? Int ?: -1) as T?
        Boolean::class -> getBoolean(key, defaultValue as? Boolean ?: false) as T?
        Float::class -> getFloat(key, defaultValue as? Float ?: -1f) as T?
        Long::class -> getLong(key, defaultValue as? Long ?: -1) as T?
        else -> throw UnsupportedOperationException("Not yet implemented")
    }
}

6. Akses PreferenceManager ke dalam lapisan presentasi Anda

Yes, Now your PreferenceManager class is ready for use. You can initialize PreferenceManager class into your ViewModel and Activity/Fragment, Make sure the context should be applicationContext.

7.Buka activity_main.xml dan paste kode di bawah ini.

Untuk membuat contoh yang menarik, saya telah menambahkan dua teks edit dan satu tombol di tata letak ini

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Hello World!" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="User Id"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="API Key"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Show Preference Data"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText2" />

</androidx.constraintlayout.widget.ConstraintLayout>

8. Biarkan akses kelas PreferenceManager di file sumber Anda

Mari kita periksa kode di bawah ini Dengan cara ini Anda dapat dengan mudah membaca dan menulis nilainya di SharePreferences

package com.sharedpreferencesexample

import android.annotation.SuppressLint
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private val preferenceHelper: IPreferenceHelper by lazy { PreferenceManager(applicationContext) }

    @SuppressLint("SetTextI18n")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // display saved data
        textView.text =
            " API Key - > ${preferenceHelper.getApiKey()} \n User Id -> ${preferenceHelper.getUserId()}"
        button.setOnClickListener {
            // Update data in SharedPreference
            preferenceHelper.setApiKey(editText.text.toString())
            preferenceHelper.setUserId(editText2.text.toString())
            // display saved data
            textView.text =
                " API Key - > ${preferenceHelper.getApiKey()} \n User Id -> ${preferenceHelper.getUserId()}"
        }

    }
}

7. Build & Test

Biarkan menjalankan aplikasi, dalam gerakan aplikasi Anda akan aktif dan berjalan, Sekarang masukkan beberapa nilai EditText ini dan klik tombol. Nilai akan ditampilkan di TextView. Dengan cara ini Anda dapat membaca dan menulis sejumlah kecil data dalam pasangan nilai kunci!

Kesimpulan

Dalam contoh SharedPreferences android ini, kita akan mempelajari bagaimana kita dapat menyimpan dan mengambil nilai di SharedPreferences. Saya mencoba mengikuti praktik terbaik untuk pengembangan Android. Tetap saja, Anda ingin meningkatkan… Sangat Selamat datang

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button