This is time to say bye bye to SharePreferences. Jetpack DataStore is new solution to store data. It is replacement of SharePreferences. Preferences DataStore is one way of DataStore to save data.
In share preference, we can only save data in key-value. It allows us to store data in key-value pair and in form of object as well.
It saves data using Async Api and it builds with coroutines and flow.
Implementation
DataStore provides two different implementations :
- Preferences DataStore : It stored data in key-value pair.
- Proto DataStore : It stores a custom data type. We need to define a scheme using protocol buffers.
In this blog, we will cover Preferences DataStore only.
Setup
Add Dependency
1 |
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha06" |
Create a Preference DataStore
Now, create a instance of datastore. It will create a file name as “MyDataStore”.
“createDataStore” is a extension function created on Context. Method will return DataStore instance.
1 2 3 |
val dataStore: DataStore<Preferences> = createDataStore( name = "MyDataStore" ) |
Create Key for Data
To save the data, first we need to create a key for our value.
1 |
val CUSTOMER_NAME = stringPreferencesKey("customer_name") |
This will define the name of key and it’s type.
If you wanna save int value, you will have to use ‘intPreferencesKey‘.
Write Data
1 2 3 4 5 |
suspend fun saveData() { dataStore.edit {dataStore-> dataStore[CUSTOMER_NAME] = "Ayushi" } } |
‘edit‘ method is used to save data in DataStore. It is suspend function. It should be called by either coroutines or another suspend function.
Call a suspend function :
1 2 3 |
GlobalScope.launch { saveData() } |
We use Global scope to create coroutines.
Check following link for kotlin coroutines : Kotlin Coroutines
Read Data
1 2 |
var obj : Flow<String> = dataStore.data .map { preferences -> preferences[CUSTOMER_NAME] ?: "" } |
DataStores provides data property to expose the value.
We create string type flow object.
Flow :
1 |
An asynchronous data stream that sequentially emits values and completes normally or with an exception. |
To learn more about flow, check following link : Kotlin Flow
Hopefully, this blog will be helpful for you.