Site icon C1CTech

Android Jetpack Preferences DataStore Example

&NewLine;<p class&equals;"p1">This blog is about Android Jetpack <span style&equals;"color&colon; &num;008000&semi;"><strong>DataStore Preferences<&sol;strong><&sol;span> and how to implement DataStore Preferences in our Android application&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<div class&equals;"wp-block-buttons aligncenter is-layout-flex wp-block-buttons-is-layout-flex">&NewLine;<div class&equals;"wp-block-button"><a class&equals;"wp-block-button&lowbar;&lowbar;link has-white-color has-text-color has-background" href&equals;"https&colon;&sol;&sol;github&period;com&sol;arunk7839&sol;JetpackDataStore" style&equals;"background-color&colon;&num;520599" target&equals;"&lowbar;blank" rel&equals;"noreferrer noopener"><strong>DOWNLOAD CODE<&sol;strong><&sol;a><&sol;div>&NewLine;<&sol;div>&NewLine;&NewLine;&NewLine;&NewLine;<figure class&equals;"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class&equals;"wp-block-embed&lowbar;&lowbar;wrapper">&NewLine;<amp-youtube layout&equals;"responsive" width&equals;"1200" height&equals;"675" data-videoid&equals;"Lz-UCuTicpw" title&equals;"Android Jetpack Preferences Datastore Example"><a placeholder href&equals;"https&colon;&sol;&sol;youtu&period;be&sol;Lz-UCuTicpw"><img src&equals;"https&colon;&sol;&sol;i&period;ytimg&period;com&sol;vi&sol;Lz-UCuTicpw&sol;hqdefault&period;jpg" layout&equals;"fill" object-fit&equals;"cover" alt&equals;"Android Jetpack Preferences Datastore Example"><&sol;a><&sol;amp-youtube>&NewLine;<&sol;div><&sol;figure>&NewLine;&NewLine;&NewLine;&NewLine;<h3 class&equals;"wp-block-heading"><strong><span style&equals;"color&colon; &num;000080&semi;">DataStore<&sol;span><&sol;strong><&sol;h3>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"ul1 wp-block-list"><li class&equals;"li2">Jetpack <span style&equals;"color&colon; &num;008000&semi;"><strong>DataStore<&sol;strong><&sol;span> is a data storage solution&period;<&sol;li><li class&equals;"li2">It allows us to store key-value pairs &lpar;like&nbsp&semi;<i>SharedPreferences<&sol;i>&rpar; or typed objects with&nbsp&semi;<strong><span style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developers&period;google&period;com&sol;protocol-buffers"><span class&equals;"s2">protocol buffers<&sol;span><&sol;a>&nbsp&semi;<&sol;span><&sol;strong><i>&lpar;discuss in the next article&rpar;<&sol;i>&period;<&sol;li><li class&equals;"li2">DataStore uses Kotlin&comma; Coroutines and Flow to store data asynchronously with consistency and transaction support&period;<&sol;li><li class&equals;"li2"><span style&equals;"color&colon; &num;008000&semi;"><strong>DataStore<&sol;strong><&sol;span> is the new data storage solution which is the replacement of <span style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;kotlin&sol;android&sol;content&sol;SharedPreferences"><span class&equals;"s2"><b>SharedPreferences<&sol;b><&sol;span><&sol;a><&sol;span><b><i>&period;<&sol;i><&sol;b><&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<h3 class&equals;"p1 wp-block-heading"><span style&equals;"color&colon; &num;000080&semi;"><b>Types of DataStore<&sol;b><&sol;span><&sol;h3>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"p2">DataStore&nbsp&semi;provides two different types of implementations to store data&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"ul1 wp-block-list"><li class&equals;"li2"><b><span style&equals;"color&colon; &num;0000ff&semi;"> Preferences DataStore<&sol;span>&nbsp&semi;<&sol;b>— This uses key-value pairs to store data&period; But it doesn’t provide type-safety&period;<&sol;li><li class&equals;"li2"><b><span style&equals;"color&colon; &num;0000ff&semi;"> Proto DataStore<&sol;span> —&nbsp&semi;<&sol;b>It stores data as a custom type with specified schema using<span style&equals;"color&colon; &num;0000ff&semi;"><strong>&nbsp&semi;<a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developers&period;google&period;com&sol;protocol-buffers"><span class&equals;"s2">Protocol Buffers<&sol;span><&sol;a><&sol;strong><&sol;span>&nbsp&semi;<i>&lpar;discuss in the next article&rpar;&period;<&sol;i><&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<h3 class&equals;"p1 wp-block-heading"><span style&equals;"color&colon; &num;000080&semi;"><b>Creating new project<&sol;b><&sol;span><&sol;h3>&NewLine;&NewLine;&NewLine;&NewLine;<ol class&equals;"wp-block-list"><li>Create a new project by going to&nbsp&semi;<span style&equals;"color&colon; &num;008000&semi;"><b>File&nbsp&semi;<&sol;b><span class&equals;"s1"><b>&Implies;<&sol;b><&sol;span><&sol;span><b><span style&equals;"color&colon; &num;008000&semi;">&nbsp&semi;New Android Project<&sol;span>&comma;<&sol;b> select <span style&equals;"color&colon; &num;008000&semi;"><strong>Empty Activity<&sol;strong> <span style&equals;"color&colon; &num;000000&semi;">&comma; provide <strong><span style&equals;"color&colon; &num;008000&semi;">app name<&sol;span><&sol;strong>&comma; select language to <span style&equals;"color&colon; &num;008000&semi;"><strong>kotlin <&sol;strong><&sol;span><&sol;span><&sol;span>and then finally click on <span style&equals;"color&colon; &num;0000ff&semi;"><strong>finish<&sol;strong><&sol;span>&period;<&sol;li><li> Open project&&num;8217&semi;s app level <strong style&equals;"font-size&colon; inherit&semi;"><span style&equals;"color&colon; &num;008000&semi;">build&period;gradle<&sol;span><&sol;strong><span style&equals;"font-size&colon; inherit&semi;"> file&colon;<&sol;span> <&sol;li><&sol;ol>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li>Go to the <span style&equals;"color&colon; &num;008000&semi;"><strong>android<&sol;strong><&sol;span> block and add the below lines&period;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">compileOptions &lbrace;&NewLine; sourceCompatibility JavaVersion&period;VERSION&lowbar;1&lowbar;8&NewLine; targetCompatibility JavaVersion&period;VERSION&lowbar;1&lowbar;8&NewLine;&rcub;&NewLine;&NewLine;kotlinOptions &lbrace;&NewLine; jvmTarget &equals; '1&period;8'&NewLine;&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"ul1 wp-block-list"><li class&equals;"li1">Now add the below dependencies inside dependencies block&period; Once you have added all these&comma; <strong><span style&equals;"color&colon; &num;008000&semi;">sync<&sol;span><&sol;strong> your project&period;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">dependencies &lbrace; &NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol; Preferences DataStore<&sol;strong><&sol;span>&NewLine; implementation "androidx&period;datastore&colon;datastore-preferences&colon;1&period;0&period;0-alpha07"&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; Lifecycle component<&sol;strong><&sol;span>&NewLine; implementation "androidx&period;lifecycle&colon;lifecycle-livedata-ktx&colon;2&period;2&period;0"&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; Kotlin coroutines components<&sol;strong><&sol;span>&NewLine; api "org&period;jetbrains&period;kotlinx&colon;kotlinx-coroutines-core&colon;1&period;3&period;9"&NewLine; api "org&period;jetbrains&period;kotlinx&colon;kotlinx-coroutines-android&colon;1&period;3&period;9"&NewLine;&NewLine;&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p>3 &period; Open your <span style&equals;"color&colon; &num;0000ff&semi;"><strong>activity&lowbar;main&period;xml&period;<&sol;strong><span style&equals;"color&colon; &num;000000&semi;"> To create the following UI&comma; add the below code<&sol;span><strong>&period;<&sol;strong><&sol;span><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<div class&equals;"wp-block-image"><figure class&equals;"aligncenter is-resized"><img src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2021&sol;03&sol;Screenshot&lowbar;1614855387&period;png" alt&equals;"" class&equals;"wp-image-2386" width&equals;"356" height&equals;"633"&sol;><&sol;figure><&sol;div>&NewLine;&NewLine;&NewLine;&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>activity&lowbar;main&period;xml<&sol;strong><&sol;span><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">&lt&semi;&quest;xml version&equals;"1&period;0" encoding&equals;"utf-8"&quest;&gt&semi;&NewLine;&lt&semi;androidx&period;constraintlayout&period;widget&period;ConstraintLayout xmlns&colon;android&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res&sol;android"&NewLine; xmlns&colon;app&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res-auto"&NewLine; xmlns&colon;tools&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;tools"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"match&lowbar;parent"&NewLine; tools&colon;context&equals;"&period;MainActivity"&gt&semi;&NewLine;&NewLine; &lt&semi;Button&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;btn&lowbar;save"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;60dp"&NewLine; android&colon;background&equals;"&commat;drawable&sol;background"&NewLine; android&colon;padding&equals;"&commat;dimen&sol;padding&lowbar;18dp"&NewLine; android&colon;text&equals;"Save user"&NewLine; android&colon;textColor&equals;"&commat;android&colon;color&sol;white"&NewLine; android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;15sp"&NewLine; android&colon;textStyle&equals;"bold"&NewLine; app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;switch&lowbar;gender"&NewLine; app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;switch&lowbar;gender"&NewLine; app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;switch&lowbar;gender" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;EditText&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;et&lowbar;lname"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"&NewLine; android&colon;ems&equals;"10"&NewLine; android&colon;hint&equals;"&commat;string&sol;hint&lowbar;enter&lowbar;last&lowbar;name"&NewLine; app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;et&lowbar;fname"&NewLine; app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;et&lowbar;fname"&NewLine; app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;et&lowbar;fname" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;EditText&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;et&lowbar;age"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"&NewLine; android&colon;ems&equals;"10"&NewLine; android&colon;hint&equals;"&commat;string&sol;hint&lowbar;enter&lowbar;age"&NewLine; android&colon;inputType&equals;"number"&NewLine; app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;et&lowbar;lname"&NewLine; app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;et&lowbar;lname"&NewLine; app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;et&lowbar;lname"&NewLine; tools&colon;layout&lowbar;editor&lowbar;absoluteY&equals;"317dp" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;EditText&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;et&lowbar;fname"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;30dp"&NewLine; android&colon;ems&equals;"10"&NewLine; android&colon;hint&equals;"&commat;string&sol;hint&lowbar;enter&lowbar;first&lowbar;name"&NewLine; app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;tv&lowbar;gender"&NewLine; app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;gender"&NewLine; app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;gender"&NewLine; tools&colon;layout&lowbar;editor&lowbar;absoluteY&equals;"178dp" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;TextView&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;fname"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;30dp"&NewLine; android&colon;textStyle&equals;"bold"&NewLine; android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"&NewLine; android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"&NewLine; app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"parent"&NewLine; app&colon;layout&lowbar;constraintHorizontal&lowbar;bias&equals;"0&period;5"&NewLine; app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"parent"&NewLine; app&colon;layout&lowbar;constraintTop&lowbar;toTopOf&equals;"parent" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;TextView&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;lname"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"&NewLine; android&colon;textStyle&equals;"bold"&NewLine; android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"&NewLine; android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"&NewLine; app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;tv&lowbar;fname"&NewLine; app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;fname"&NewLine; app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;fname" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;TextView&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;age"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"&NewLine; android&colon;textStyle&equals;"bold"&NewLine; android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"&NewLine; android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"&NewLine; app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;tv&lowbar;lname"&NewLine; app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;lname"&NewLine; app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;lname" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;TextView&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;gender"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"&NewLine; android&colon;textStyle&equals;"bold"&NewLine; android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"&NewLine; android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"&NewLine; app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;tv&lowbar;age"&NewLine; app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;age"&NewLine; app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;age" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;androidx&period;appcompat&period;widget&period;SwitchCompat&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;switch&lowbar;gender"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"&NewLine; android&colon;text&equals;"&commat;string&sol;female&lowbar;male"&NewLine; android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"&NewLine; app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;et&lowbar;age"&NewLine; app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;et&lowbar;age"&NewLine; app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;et&lowbar;age" &sol;&gt&semi;&NewLine;&NewLine;&lt&semi;&sol;androidx&period;constraintlayout&period;widget&period;ConstraintLayout&gt&semi;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<h4 class&equals;"p1 wp-block-heading"><strong><span style&equals;"color&colon; &num;000080&semi;">Creating a Preferences DataStore<&sol;span><&sol;strong><&sol;h4>&NewLine;&NewLine;&NewLine;&NewLine;<p><span style&equals;"color&colon; &num;000000&semi;">4&period; Create a new kotlin file<strong><span style&equals;"color&colon; &num;008000&semi;"> User&period;kt<&sol;span><&sol;strong> and add the below code&period;&nbsp&semi;<&sol;span><&sol;p>&NewLine;<&excl;-- WP QUADS Content Ad Plugin v&period; 2&period;0&period;98&period;1 -->&NewLine;<div class&equals;"quads-location quads-ad2" id&equals;"quads-ad2" style&equals;"float&colon;none&semi;margin&colon;0px&semi;">&NewLine;&NewLine;<&sol;div>&NewLine;&NewLine;&NewLine;&NewLine;&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">User&period;kt<&sol;span><&sol;strong><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">package com&period;c1ctech&period;jetpackdatastore&NewLine;&NewLine;import android&period;content&period;Context&NewLine;import androidx&period;datastore&period;core&period;DataStore&NewLine;import androidx&period;datastore&period;preferences&period;core&period;Preferences&NewLine;import androidx&period;datastore&period;preferences&period;preferencesDataStore&NewLine;&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; At the top level of your kotlin file<&sol;strong><&sol;span>&NewLine;val Context&period;dataStore&colon; DataStore&lt&semi;Preferences&gt&semi; by preferencesDataStore&lpar;name &equals; "user&lowbar;prefs"&rpar;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li class&equals;"p1"><strong><span style&equals;"color&colon; &num;0000ff&semi;">dataStore<&sol;span><&sol;strong>&colon; instance of <span class&equals;"s2"><span style&equals;"color&colon; &num;008000&semi;"><strong>Datastore&lt&semi;Preferences&gt&semi;<&sol;strong><&sol;span> created by&nbsp&semi;<span style&equals;"color&colon; &num;0000ff&semi;"><strong><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;kotlin&sol;androidx&sol;datastore&sol;preferences&sol;package-summary&num;dataStore"><span class&equals;"s1">preferencesDataStore<&sol;span><&sol;a><&sol;strong><&sol;span>&period;<&sol;span><&sol;li><li class&equals;"p1"><strong><span class&equals;"s2" style&equals;"font-size&colon; 16px&semi; font-family&colon; -apple-system&comma; BlinkMacSystemFont&comma; 'Segoe UI'&comma; Roboto&comma; Oxygen-Sans&comma; Ubuntu&comma; Cantarell&comma; 'Helvetica Neue'&comma; sans-serif&semi; color&colon; &num;0000ff&semi;">name<&sol;span><&sol;strong><span style&equals;"font-size&colon; 16px&semi; font-family&colon; -apple-system&comma; BlinkMacSystemFont&comma; 'Segoe UI'&comma; Roboto&comma; Oxygen-Sans&comma; Ubuntu&comma; Cantarell&comma; 'Helvetica Neue'&comma; sans-serif&semi;"><strong><span style&equals;"color&colon; &num;0000ff&semi;"> parameter&lpar;mandatory&rpar;<&sol;span><&sol;strong> &colon; is the name of the Preferences DataStore&period;<&sol;span><&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<p>5 &period;Create a new kotlin class <span style&equals;"color&colon; &num;008000&semi;"><strong>UserManager&period;kt<&sol;strong><&sol;span> and add the below code&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">UserManager&period;kt<&sol;span><&sol;strong><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">package com&period;c1ctech&period;jetpackdatastore&NewLine;&NewLine;import androidx&period;datastore&period;core&period;DataStore&NewLine;import androidx&period;datastore&period;preferences&period;core&period;&ast;&NewLine;import kotlinx&period;coroutines&period;flow&period;Flow&NewLine;import kotlinx&period;coroutines&period;flow&period;map&NewLine;&NewLine;class UserManager&lpar;val dataStore&colon; DataStore&lt&semi;Preferences&gt&semi;&rpar; &lbrace;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol;Create some keys<&sol;strong><&sol;span>&NewLine; companion object &lbrace;&NewLine; val USER&lowbar;AGE&lowbar;KEY &equals; intPreferencesKey&lpar;"USER&lowbar;AGE"&rpar;&NewLine; val USER&lowbar;FIRST&lowbar;NAME&lowbar;KEY &equals; stringPreferencesKey&lpar;"USER&lowbar;FIRST&lowbar;NAME"&rpar;&NewLine; val USER&lowbar;LAST&lowbar;NAME&lowbar;KEY &equals; stringPreferencesKey&lpar;"USER&lowbar;LAST&lowbar;NAME"&rpar;&NewLine; val USER&lowbar;GENDER&lowbar;KEY &equals; booleanPreferencesKey&lpar;"USER&lowbar;GENDER"&rpar;&NewLine; &rcub;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;Store user data<&sol;strong><&sol;span>&NewLine; suspend fun storeUser&lpar;age&colon; Int&comma; fname&colon; String&comma; lname&colon; String&comma; isMale&colon; Boolean&rpar; &lbrace;&NewLine; dataStore&period;edit &lbrace;&NewLine; it&lbrack;USER&lowbar;AGE&lowbar;KEY&rsqb; &equals; age&NewLine; it&lbrack;USER&lowbar;FIRST&lowbar;NAME&lowbar;KEY&rsqb; &equals; fname&NewLine; it&lbrack;USER&lowbar;LAST&lowbar;NAME&lowbar;KEY&rsqb; &equals; lname&NewLine; it&lbrack;USER&lowbar;GENDER&lowbar;KEY&rsqb; &equals; isMale&NewLine;&NewLine; &rcub;&NewLine; &rcub;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;Create an age flow<&sol;span><&sol;strong>&NewLine; val userAgeFlow&colon; Flow&lt&semi;Int&quest;&gt&semi; &equals; dataStore&period;data&period;map &lbrace;&NewLine; it&lbrack;USER&lowbar;AGE&lowbar;KEY&rsqb;&NewLine; &rcub;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol;Create a fname flow<&sol;span><&sol;strong>&NewLine; val userFirstNameFlow&colon; Flow&lt&semi;String&quest;&gt&semi; &equals; dataStore&period;data&period;map &lbrace;&NewLine; it&lbrack;USER&lowbar;FIRST&lowbar;NAME&lowbar;KEY&rsqb;&NewLine; &rcub;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;Create a lname flow<&sol;strong><&sol;span>&NewLine; val userLastNameFlow&colon; Flow&lt&semi;String&quest;&gt&semi; &equals; dataStore&period;data&period;map &lbrace;&NewLine; it&lbrack;USER&lowbar;LAST&lowbar;NAME&lowbar;KEY&rsqb;&NewLine; &rcub;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;Create a gender flow<&sol;span><&sol;strong>&NewLine; val userGenderFlow&colon; Flow&lt&semi;Boolean&quest;&gt&semi; &equals; dataStore&period;data&period;map &lbrace;&NewLine; it&lbrack;USER&lowbar;GENDER&lowbar;KEY&rsqb;&NewLine; &rcub;&NewLine;&NewLine;&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>Defining Key for the Value that needs to be saved&colon;<&sol;strong><&sol;span><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li class&equals;"p1">To define a key for each value that you need to store in the <span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s1">DataStore&lt&semi;Preferences&gt&semi;<&sol;span><&sol;strong><&sol;span> instance&comma; you must use the corresponding key type function&period; For example&colon;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">val USER&lowbar;AGE&lowbar;KEY &equals; intPreferencesKey&lpar;"USER&lowbar;AGE"&rpar;&NewLine;val USER&lowbar;FIRST&lowbar;NAME&lowbar;KEY &equals; stringPreferencesKey&lpar;"USER&lowbar;FIRST&lowbar;NAME"&rpar;&NewLine;val USER&lowbar;LAST&lowbar;NAME&lowbar;KEY &equals; stringPreferencesKey&lpar;"USER&lowbar;LAST&lowbar;NAME"&rpar;&NewLine;val USER&lowbar;GENDER&lowbar;KEY &equals; booleanPreferencesKey&lpar;"USER&lowbar;GENDER"&rpar;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>Saving Value to Preference DataStore&colon;<&sol;strong><&sol;span><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li class&equals;"p1">Preferences DataStore provides an <strong><span style&equals;"color&colon; &num;008000&semi;">edit &lpar;&rpar;<&sol;span><span class&equals;"s1"><a style&equals;"color&colon; &num;008000&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;kotlin&sol;androidx&sol;datastore&sol;preferences&sol;core&sol;Preferences">&nbsp&semi;<&sol;a><&sol;span><&sol;strong><span style&equals;"font-size&colon; 16px&semi; font-family&colon; -apple-system&comma; BlinkMacSystemFont&comma; 'Segoe UI'&comma; Roboto&comma; Oxygen-Sans&comma; Ubuntu&comma; Cantarell&comma; 'Helvetica Neue'&comma; sans-serif&semi;">function using which we can save our values to keys&period;<&sol;span><&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>Reading Value back from Preference DataStore&colon;<&sol;strong><&sol;span><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li>To read the value from a Preferences DataStore we need to use the <span style&equals;"color&colon; &num;008000&semi;"><strong>DataStore&period;data<&sol;strong><&sol;span> property which returns a <span style&equals;"color&colon; &num;008000&semi;"><strong>Flow&lt&semi;Preferences&gt&semi;<&sol;strong><&sol;span> and with the <strong><span style&equals;"color&colon; &num;008000&semi;">&period;map&lbrace;&rcub;<&sol;span><&sol;strong> operator we can can get the<strong><span style&equals;"color&colon; &num;008000&semi;"> Flow&lt&semi;&gt&semi;<&sol;span><&sol;strong> &lpar;value&rpar; by passing the right key into the preferences&period;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<p>6 &period; Open <span style&equals;"color&colon; &num;008000&semi;"><strong>MainActivity&period;kt<&sol;strong><&sol;span> and add the below code&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">MainActivity&period;kt<&sol;span><&sol;strong><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">package com&period;c1ctech&period;jetpackdatastore&NewLine;&NewLine;import androidx&period;appcompat&period;app&period;AppCompatActivity&NewLine;import android&period;os&period;Bundle&NewLine;import androidx&period;lifecycle&period;asLiveData&NewLine;import androidx&period;lifecycle&period;observe&NewLine;import kotlinx&period;android&period;synthetic&period;main&period;activity&lowbar;main&period;&ast;&NewLine;import kotlinx&period;coroutines&period;GlobalScope&NewLine;import kotlinx&period;coroutines&period;launch&NewLine;&NewLine;class MainActivity &colon; AppCompatActivity&lpar;&rpar; &lbrace;&NewLine; lateinit var userManager&colon; UserManager&NewLine; var age &equals; 0&NewLine; var fname &equals; ""&NewLine; var lname &equals; ""&NewLine; var gender &equals; ""&NewLine;&NewLine; override fun onCreate&lpar;savedInstanceState&colon; Bundle&quest;&rpar; &lbrace;&NewLine; super&period;onCreate&lpar;savedInstanceState&rpar;&NewLine; setContentView&lpar;R&period;layout&period;activity&lowbar;main&rpar;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;Get reference to our userManager class<&sol;span><&sol;strong>&NewLine; userManager &equals; UserManager&lpar;dataStore&rpar;&NewLine;&NewLine; buttonSave&lpar;&rpar;&NewLine;&NewLine; observeData&lpar;&rpar;&NewLine; &rcub;&NewLine;&NewLine; private fun observeData&lpar;&rpar; &lbrace;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol;Updates age<&sol;span><&sol;strong>&NewLine; userManager&period;userAgeFlow&period;asLiveData&lpar;&rpar;&period;observe&lpar;this&comma; &lbrace;&NewLine; if &lpar;it &excl;&equals; null&rpar; &lbrace;&NewLine; age &equals; it&NewLine; tv&lowbar;age&period;text &equals; it&period;toString&lpar;&rpar;&NewLine; &rcub;&NewLine; &rcub;&rpar;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;Updates firstname<&sol;span><&sol;strong>&NewLine; userManager&period;userFirstNameFlow&period;asLiveData&lpar;&rpar;&period;observe&lpar;this&comma; &lbrace;&NewLine; if &lpar;it &excl;&equals; null&rpar; &lbrace;&NewLine; fname &equals; it&NewLine; tv&lowbar;fname&period;text &equals; it&NewLine; &rcub;&NewLine; &rcub;&rpar;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;Updates lastname<&sol;strong><&sol;span>&NewLine; userManager&period;userLastNameFlow&period;asLiveData&lpar;&rpar;&period;observe&lpar;this&comma; &lbrace;&NewLine; if &lpar;it &excl;&equals; null&rpar; &lbrace;&NewLine; lname &equals; it&NewLine; tv&lowbar;lname&period;text &equals; it&NewLine; &rcub;&NewLine; &rcub;&rpar;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol;Updates gender<&sol;strong><&sol;span>&NewLine; userManager&period;userGenderFlow&period;asLiveData&lpar;&rpar;&period;observe&lpar;this&comma; &lbrace;&NewLine; if &lpar;it &excl;&equals; null&rpar; &lbrace;&NewLine; gender &equals; if &lpar;it&rpar; "Male" else "Female"&NewLine; tv&lowbar;gender&period;text &equals; gender&NewLine; &rcub;&NewLine; &rcub;&rpar;&NewLine; &rcub;&NewLine;&NewLine; private fun buttonSave&lpar;&rpar; &lbrace;&NewLine;&NewLine; <strong> <span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol;Gets the user input and saves it<&sol;span><&sol;strong>&NewLine; btn&lowbar;save&period;setOnClickListener &lbrace;&NewLine; fname &equals; et&lowbar;fname&period;text&period;toString&lpar;&rpar;&NewLine; lname &equals; et&lowbar;lname&period;text&period;toString&lpar;&rpar;&NewLine; age &equals; et&lowbar;age&period;text&period;toString&lpar;&rpar;&period;toInt&lpar;&rpar;&NewLine; val isMale &equals; switch&lowbar;gender&period;isChecked&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol;Stores the values<&sol;strong><&sol;span>&NewLine; GlobalScope&period;launch &lbrace;&NewLine; userManager&period;storeUser&lpar;age&comma; fname&comma; lname&comma; isMale&rpar;&NewLine; &rcub;&NewLine; &rcub;&NewLine; &rcub;&NewLine;&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li class&equals;"p1">In order to get the saved values in the activity from the DataStore&comma; we need to change the <span style&equals;"color&colon; &num;008000&semi;"><strong>Flow&lt&semi;&gt&semi;<&sol;strong><&sol;span> to LiveData with <span style&equals;"color&colon; &num;008000&semi;"><strong>&period;asLiveData&lpar;&rpar;&nbsp&semi;<&sol;strong><&sol;span>and observe it&period;<&sol;li><&sol;ul>&NewLine;&NewLine;

Exit mobile version