CategoriesAndroidProgramming

DataStore, pengganti SharedPreferences yang lebih modern

kita mungkin lebih sering menggunakan SharedPreferences untuk menyimpan data Persistance seperti Session. kini ada cara yang lebih modern untuk menyimpan data Persistance sederhana dari Android Jetpack yaitu “DataStore”.

DataStore adalah solusi penyimpanan data yang memungkinkan Anda menyimpan key-value pair atau objek yang diketik dengan buffering protokol. DataStore menggunakan coroutine Kotlin dan Flow untuk menyimpan data secara asynchronous, konsisten, dan transaksional. Google menyarankan Developer Android berpindah dari SharedPreferences ke DataStore karena DataStore memiliki beberapa keunggulan diantaranya :

  • Proses pemrosesan data Lebih aman karena DataStore berjalan di Background Thread sehingga memperkecil adanya ANR bukan UI Thread yang dapat meng-block UI seperti SharedPreference.
  • DataStore menampilkan pesan saat ada error disaat memproses data, sedangkan SharedPreferences tidak.
  • Ukuran file DataStore lebih kecil daripada SharedPreferences karena DataStore menggunakan json bukan xml

DataStore memiliki dua jenis implementasi yang memiliki keunggulan masing-masing, antara lain :

  • Preferences DataStore menyimpan dan mengakses data menggunakan kunci. Implementasi ini tidak memerlukan skema yang telah ditetapkan sebelumnya, dan tidak memberikan keamanan jenis.
  • Proto DataStore menyimpan data sebagai instance jenis data kustom. Implementasi ini mengharuskan Anda untuk menentukan skema menggunakan buffering protokol, tetapi memberikan keamanan jenis.

pada artikel ini kita akan membahas bagaimana menerapkan Preferences DataStore di Aplikasi kita, baiklah langsung kita praktekkan.

pada build.gradle (app) pasang library datastore

implementation "androidx.datastore:datastore-preferences:1.0.0"

setelah library terinstall, coba buat satu class khusus untuk mengakses DataStore

DataStore memerlukan Context maka kita perlu memasukkan Context ke dalam code kita, disini kita masukkan ke constructor class.

private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user")

lalu pada baris pertama di class, kita beri satu Extension untuk Context agar kita bisa mengakses dataStore lewat Context. disini kita juga mendefinisikan nama Preferences kita, disini saya beri nama “user”

companion object {
    val USER_ID = stringPreferencesKey("user")
    val NAME = stringPreferencesKey("name")
    val TOKEN = stringPreferencesKey("token")
}

pada companion object kita mendefinisikan key dan type data dari value yang akan kita simpan. disini kita menggunakan type data String maka key nya di definisikan sebagai stringPreferencesKey(“key”), jika bertype Integer bisa menggunakan intPreferencesKey, dan jika ingin melihat type lain bisa dengan meng klik pada stringPreferencesKey.

suspend fun saveToDataStore(userId: String?, name: String?, token: String?) {
    context.dataStore.edit {
        it[USER_ID] = userId ?: ""
        it[NAME] = name ?: ""
        it[TOKEN] = token ?: ""
    }
}

lalu ada suspend function saveToDataStore yang berfungsi untuk menyimpan value ke DataStore. disini kita menggunakan suspend fun karena memang proses penyimpanan pada DataStore mengharuskan berjalan di Background Thread.

fun getFromDataStore() = context.dataStore.data.map {
    UserPreferences(
        it[USER_ID] ?: "",
        it[NAME] ?: "",
        it[TOKEN] ?: ""
    )
}

lalu ada function getFromDataStore untuk mendapatkan data yang tersimpan di DataStore. disini kita tidak menggunakan suspend function apakah menandakan kalau proses mendapatkan data berjalan synchronous ? tentu tidak, jika kita lihat function getFromDataStore ini mengembalikan data bertype Coroutines Flow.

oh iya disini saya menampung data nya ke dalam Object UserPreferences, jadi disini getFromDataStore mengambalikan hasil berupa Object UserPreferences. jangan lupa bikin objectnya dulu yaa biar nggak error.

suspend fun deleteSession() = context.dataStore.edit {
    it.clear()
}

lalu di bawah sendiri ada function deleteSession untuk menghapus data yang kita simpan pada DataStore. cukup menggunakan method clear(). dan disini juga berjalan di background thread.

// pada Activity
val dataStoreManager = DataStoreManager(this)

// pada Fragment
val dataStoreManager = DataStoreManager(requireContext())

untuk menggunakan class DataStoreManager kita hanya perlu mendefinisikannya dan memasukkan context ke dalam parameternya seperti berikut.

runBlocking {
    dataStoreManager.saveToDataStore("abcdef", "User Named", "ab2bj424n")
}

lalu untuk menyimpan data nya kita perlu menjalankan method nya pada runBlocking agar kode tersebut berjalan di Background. seperti berikut

runBlocking {
    dataStoreManager.getFromDataStore().collectLatest { prefs ->
       // lakukan sesuatu dengan object prefs disini
    }
}

untuk mendapatkan datanya kita juga perlu menggunakan runBlocking dan collectLatest karena nilai yang dikembalikan oleh getFromDataStore bertype Flow.

Bagaimana lebih sulit mana menggunakan SharedPreferences atau DataStore ? untuk berjaga-jaga sebaiknya mempelajari DataStore sekarang karena kemungkinan SharedPreferences suatu saat akan deprecated karena banyak yang sudah beralih ke DataStore.

Published by Ahmad Saifur Ridlo

Android Developer at Algostudio.net

Leave a Reply

Your email address will not be published.