Migrasi dari SharedPreferences API ke library Jetpack Datastore, library baru untuk solusi data storage di android
Apa itu DataStore ?
Beberapa hari lalu Google merilis library baru yang tergabung dalam jetpack component yaitu Datastore
. Jetpack Component selalu menghadirkan library — library yang membuat kode android menjadi lebih baik dan minim boilerplate. Library DataStore ini yang menurut blog resmi bertujuan untuk menggantikan SharedPreferences
API yang memiliki beberapa kekurangan
Library Datastore
di buat dengan Coroutines dan Flowuntuk menyimpan data secara asynchronous. Datastore memungkinkan kita untuk menyimpan data key-value seperti SharedPreferences
atau menyimpan data dalam bentuk typed-object
(Proto Buffer)
SharedPreferences ✖️ DataStore
- Ada beberapa keunggulan antara
SharedPreferences
denganDataStore
- DataStore menyediakan API asecara asynchronous untuk menyimpan dan membaca data, sedangkan SharedPreferences hanya menyediakan API synchronous saat membaca nilai yang diubah.
- DataStoreaman untuk di gunakan di UI thread. Karena menggunakan Dispatchers.io
- SharedPreferences menyebabkan runtime error sedangkan DataStore tidak
Tipe Datastore
Jetpack Datastore menyediakan 2 jenis :
- Preference Datastore — pada jenis ini, peng-implementasiannya hampir sama dengan SharedPreferences jadi ketika menyimpan data harus menggunakan key-value
- Proto Datastore — ini menyimpan data sebagai objek khusus. Ini memberikan keamanan tipe di luar kotak, tetapi mengharuskan kita untuk menentukan skema menggunakan buffer protokol.
Setup Project
Yang pertama kali dilakukan, tambahkan library di build.gradle
// Preferences DataStore
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
Write Datastore
Sebelum menulis atau menyimpan data di datastore, kita perlu membuat / init Datastore nya dahulu dengan fungsi Context.createDataStore()
// Buat Datastore-nya
val dataStore: DataStore<Preferences> = context.createDataStore(
name = "settings"
)
Lalu kita bisa membuat sebuah fungsi lain untuk store data. berikut kodenya
suspend fun incrementCounter() {
dataStore.edit { settings ->
val currentValue = settings[COUNTER] ?: 0
settings[COUNTER] = currentCounter + 1
}
}
Read data dari Datastore
DataStore
memastikan bahwa data diambil di Dispatchers.IO
sehingga UI Thread kita tidak diblok oleh sistem. Hal ini membuat Datastore lebih aman digunakan.
Berikut contoh kodenya:
val MY_COUNTER = preferencesKey<Int>("my_counter")
val myCounterFlow: Flow<Int> = dataStore.data
.map { currentPreferences ->
currentPreferences[MY_COUNTER] ?: 0
}
Sekian dari saya mohon maaf bila ada kesalahan kata 😅
Top comments (0)