Site icon C1CTech

Android Jetpack Proto DataStore Example

&NewLine;<p>This blog is about Android Jetpack <span style&equals;"color&colon; &num;000080&semi;"><strong>Proto DataStore<&sol;strong><&sol;span> and how to implement Proto DataStore 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;JetpackProtoDataStore" 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;"E1cibpnHBC4" title&equals;"Android Jetpack Proto DataStore Example"><a placeholder href&equals;"https&colon;&sol;&sol;youtu&period;be&sol;E1cibpnHBC4"><img src&equals;"https&colon;&sol;&sol;i&period;ytimg&period;com&sol;vi&sol;E1cibpnHBC4&sol;hqdefault&period;jpg" layout&equals;"fill" object-fit&equals;"cover" alt&equals;"Android Jetpack Proto DataStore Example"><&sol;a><&sol;amp-youtube>&NewLine;<&sol;div><&sol;figure>&NewLine;&NewLine;&NewLine;&NewLine;<h3 class&equals;"wp-block-heading"><span style&equals;"color&colon; &num;000080&semi;"><strong><span id&equals;"Proto-DataStore">Proto DataStore<&sol;span><&sol;strong><&sol;span><&sol;h3>&NewLine;&NewLine;&NewLine;&NewLine;<p><span style&equals;"color&colon; &num;008000&semi;"><strong>Proto DataStore<&sol;strong><&sol;span>&nbsp&semi;stores data as objects of a custom data type&period; When using Proto DataStore&comma; you have to define a schema using&nbsp&semi;<a href&equals;"https&colon;&sol;&sol;developers&period;google&period;com&sol;protocol-buffers"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><em>protocol buffers<&sol;em><&sol;strong><&sol;span><&sol;a>&period;<&sol;p>&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;<p>1 &period; Create a new project by going to <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><&sol;span> &comma; provide <span style&equals;"color&colon; &num;008000&semi;"><strong>app name<&sol;strong><&sol;span>&comma; select language to <span style&equals;"color&colon; &num;008000&semi;"><strong>kotlin <&sol;strong><&sol;span>and then finally click on <span style&equals;"color&colon; &num;0000ff&semi;"><strong>finish<&sol;strong><&sol;span>&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<h4 class&equals;"wp-block-heading" id&equals;"adding-dependencies"><span style&equals;"color&colon; &num;000080&semi;"><strong>Adding dependencies<&sol;strong><&sol;span><&sol;h4>&NewLine;&NewLine;&NewLine;&NewLine;<p>2 &period; To work with Proto DataStore and get <span style&equals;"color&colon; &num;008000&semi;"><strong>Protobuf<&sol;strong><&sol;span> to generate code for our schema&comma; we&&num;8217&semi;ll have to make several changes to the <span style&equals;"color&colon; &num;008000&semi;"><strong>build&period;gradle<&sol;strong><&sol;span> file&colon;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li>Add the <span style&equals;"color&colon; &num;008000&semi;"><strong>Protobuf<&sol;strong><&sol;span> plugin&period;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">plugins &lbrace;&NewLine; id "com&period;google&period;protobuf" version "0&period;8&period;12"&NewLine;&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li>Configure <span style&equals;"color&colon; &num;008000&semi;"><strong>Protobuf<&sol;strong><&sol;span>&period;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">protobuf &lbrace;<br> protoc &lbrace;<br> artifact &equals; "com&period;google&period;protobuf&colon;protoc&colon;3&period;10&period;0"<br> &rcub;<br><br> generateProtoTasks &lbrace;<br> all&lpar;&rpar;&period;each &lbrace; task -&gt&semi;<br> task&period;builtins &lbrace;<br> java &lbrace;<br> option 'lite'<br> &rcub;<br> &rcub;<br> &rcub;<br> &rcub;<br>&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li>Now add the below dependencies inside dependencies block&period; Once you have added all these&comma; <span style&equals;"color&colon; &num;0000ff&semi;"><strong>sync<&sol;strong><&sol;span> 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; Proto DataStore<&sol;strong><&sol;span>&NewLine; implementation "androidx&period;datastore&colon;datastore-core&colon;1&period;0&period;0-alpha01"&NewLine; implementation "com&period;google&period;protobuf&colon;protobuf-javalite&colon;3&period;10&period;0"&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; LifeCycle<&sol;span><&sol;strong>&NewLine; implementation "androidx&period;lifecycle&colon;lifecycle-extensions&colon;2&period;2&period;0"&NewLine; implementation "androidx&period;lifecycle&colon;lifecycle-runtime-ktx&colon;2&period;2&period;0"&NewLine; implementation "androidx&period;lifecycle&colon;lifecycle-livedata-ktx&colon;2&period;2&period;0"&NewLine;&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<h4 class&equals;"p1 wp-block-heading"><span style&equals;"color&colon; &num;000080&semi;"><b>Defining a Schema<&sol;b><&sol;span><&sol;h4>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"p1">3 &period; To use Proto DataStore first we need to define a schema with proto file&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"ul1 wp-block-list"><li class&equals;"li1">We will create a <strong><span style&equals;"color&colon; &num;0000ff&semi;">&period;proto<&sol;span><&sol;strong> file at&nbsp&semi;<span style&equals;"color&colon; &num;008000&semi;"><strong>app&sol;src&sol;main&sol;proto<&sol;strong><&sol;span>&nbsp&semi; location&period;&nbsp&semi;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<div class&equals;"wp-block-image"><figure class&equals;"aligncenter"><img src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2021&sol;03&sol;Screen-Shot-2021-03-08-at-10&period;25&period;33-PM&period;png" alt&equals;"" class&equals;"wp-image-2404"&sol;><&sol;figure><&sol;div>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"ul1 wp-block-list"><li>Now let’s define the schema&period;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>data&period;proto<&sol;strong><&sol;span><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">syntax &equals; "proto3"&semi;<br><br>option java&lowbar;package &equals; "com&period;c1ctech&period;jetpackprotodatastore"&semi;<br>option java&lowbar;multiple&lowbar;files &equals; true&semi;<br><br>message Person &lbrace;<br> string first&lowbar;name &equals; 1&semi;<br> string last&lowbar;name &equals; 2&semi;<br> int32 age &equals; 3&semi;<br> bool gender &equals; 4&semi;<br>&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p>4 &period; Open your <strong><span style&equals;"color&colon; &num;0000ff&semi;">activity&lowbar;main&period;xml<&sol;span>&period;<&sol;strong> To create the following UI&comma; add the below code<strong>&period;<&sol;strong><&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;1615205061&period;png" alt&equals;"" class&equals;"wp-image-2398" width&equals;"409" height&equals;"727"&sol;><&sol;figure><&sol;div>&NewLine;&NewLine;&NewLine;&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">activity&lowbar;main&period;xml<&sol;span><&sol;strong><&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;<br>&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"<br> xmlns&colon;app&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res-auto"<br> xmlns&colon;tools&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;tools"<br> android&colon;layout&lowbar;width&equals;"match&lowbar;parent"<br> android&colon;layout&lowbar;height&equals;"match&lowbar;parent"<br> tools&colon;context&equals;"&period;MainActivity"&gt&semi;<br><br> &lt&semi;Button<br> android&colon;id&equals;"&commat;&plus;id&sol;btn&lowbar;save"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;60dp"<br> android&colon;background&equals;"&commat;color&sol;colorPrimaryDark"<br> android&colon;padding&equals;"&commat;dimen&sol;padding&lowbar;18dp"<br> android&colon;text&equals;"Save user"<br> android&colon;textColor&equals;"&commat;android&colon;color&sol;white"<br> android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;15sp"<br> android&colon;textStyle&equals;"bold"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;switch&lowbar;gender"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;switch&lowbar;gender"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;switch&lowbar;gender" &sol;&gt&semi;<br><br> &lt&semi;EditText<br> android&colon;id&equals;"&commat;&plus;id&sol;et&lowbar;lname"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"<br> android&colon;ems&equals;"10"<br> android&colon;hint&equals;"&commat;string&sol;hint&lowbar;enter&lowbar;last&lowbar;name"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;et&lowbar;fname"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;et&lowbar;fname"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;et&lowbar;fname" &sol;&gt&semi;<br><br> &lt&semi;EditText<br> android&colon;id&equals;"&commat;&plus;id&sol;et&lowbar;age"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"<br> android&colon;ems&equals;"10"<br> android&colon;hint&equals;"&commat;string&sol;hint&lowbar;enter&lowbar;age"<br> android&colon;inputType&equals;"number"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;et&lowbar;lname"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;et&lowbar;lname"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;et&lowbar;lname"<br> tools&colon;layout&lowbar;editor&lowbar;absoluteY&equals;"317dp" &sol;&gt&semi;<br><br> &lt&semi;EditText<br> android&colon;id&equals;"&commat;&plus;id&sol;et&lowbar;fname"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;30dp"<br> android&colon;ems&equals;"10"<br> android&colon;hint&equals;"&commat;string&sol;hint&lowbar;enter&lowbar;first&lowbar;name"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;tv&lowbar;gender"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;gender"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;gender"<br> tools&colon;layout&lowbar;editor&lowbar;absoluteY&equals;"178dp" &sol;&gt&semi;<br><br> &lt&semi;TextView<br> android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;fname"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;30dp"<br> android&colon;textStyle&equals;"bold"<br> android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"<br> android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"parent"<br> app&colon;layout&lowbar;constraintHorizontal&lowbar;bias&equals;"0&period;5"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"parent"<br> app&colon;layout&lowbar;constraintTop&lowbar;toTopOf&equals;"parent" &sol;&gt&semi;<br><br> &lt&semi;TextView<br> android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;lname"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"<br> android&colon;textStyle&equals;"bold"<br> android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"<br> android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;tv&lowbar;fname"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;fname"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;fname" &sol;&gt&semi;<br><br> &lt&semi;TextView<br> android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;age"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"<br> android&colon;textStyle&equals;"bold"<br> android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"<br> android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;tv&lowbar;lname"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;lname"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;lname" &sol;&gt&semi;<br><br> &lt&semi;TextView<br> android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;gender"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"<br> android&colon;textStyle&equals;"bold"<br> android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"<br> android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;tv&lowbar;age"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;age"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;age" &sol;&gt&semi;<br><br> &lt&semi;androidx&period;appcompat&period;widget&period;SwitchCompat<br> android&colon;id&equals;"&commat;&plus;id&sol;switch&lowbar;gender"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;16dp"<br> android&colon;text&equals;"&commat;string&sol;female&lowbar;male"<br> android&colon;textSize&equals;"&commat;dimen&sol;textsize&lowbar;20sp"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;et&lowbar;age"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;et&lowbar;age"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;et&lowbar;age" &sol;&gt&semi;<br><br>&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"><span style&equals;"color&colon; &num;000080&semi;"><b>Create a Proto DataStore<&sol;b><&sol;span><&sol;h4>&NewLine;&NewLine;&NewLine;&NewLine;<p>5 &period; There are two steps involved in creating a Proto DataStore to store your typed objects&colon;<&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>1 &period; Create a class named <span style&equals;"color&colon; &num;008000&semi;"><strong>MySerializer<&sol;strong><&sol;span>&nbsp&semi;and write the following code&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">object MySerializer &colon; Serializer&lt&semi;Person&gt&semi; &lbrace;<br><br> override fun readFrom&lpar;input&colon; InputStream&rpar;&colon; Person &lbrace;<br> try &lbrace;<br> return Person&period;parseFrom&lpar;input&rpar;<br> &rcub; catch &lpar;exception&colon; InvalidProtocolBufferException&rpar; &lbrace;<br> throw CorruptionException&lpar;"Cannot read proto&period;"&comma; exception&rpar;<br> &rcub;<br> &rcub;<br><br> override fun writeTo&lpar;t&colon; Person&comma; output&colon; OutputStream&rpar; &lbrace;<br> t&period;writeTo&lpar;output&rpar;<br> &rcub;<br><br>&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li class&equals;"p1">The class <span style&equals;"color&colon; &num;008000&semi;"><strong>My<span class&equals;"s1">Serializer<&sol;span><&sol;strong><&sol;span> implements <span class&equals;"s1"><span style&equals;"color&colon; &num;0000ff&semi;"><strong>Serializer<&sol;strong><strong>&lt&semi;Person&gt&semi;<&sol;strong><&sol;span><&sol;span>&comma; where <span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s1">Person<&sol;span><&sol;strong><&sol;span> is the type defined in the proto file&period; This Serializer class tells DataStore how to read and write your data type&period;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<p>2&period; Create an instance of<span style&equals;"color&colon; &num;008000&semi;"><strong> <span class&equals;"s1">DataStore&lt&semi;Person&gt&semi;<&sol;span><&sol;strong><&sol;span>&comma; where <span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s1">Person<&sol;span><&sol;strong><&sol;span> is the type defined in the proto file &lpar; <strong>data&period;proto<&sol;strong> &rpar;&period;&nbsp&semi;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted"><strong>class <&sol;strong>PersonDataStore&lpar;context&colon; Context&rpar; &lbrace;&NewLine; <strong>private val dataStore<&sol;strong>&colon; DataStore&lt&semi;Person&gt&semi;&NewLine;&NewLine; <strong>init <&sol;strong>&lbrace;&NewLine; <strong>dataStore <&sol;strong>&equals; context&period;<em>createDataStore<&sol;em>&lpar;&NewLine; fileName &equals; <strong>"data&period;pb"<&sol;strong>&comma;&NewLine; serializer &equals; MySerializer&NewLine; &rpar;&NewLine; &rcub;&NewLine;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li class&equals;"p1"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s1">filename<&sol;span><&sol;strong><&sol;span>&nbsp&semi;&colon;<span class&equals;"Apple-converted-space">&nbsp&semi; <&sol;span>tells DataStore which file to use to store the data&period;<&sol;li><li class&equals;"p1"><span class&equals;"s1"><strong><span style&equals;"color&colon; &num;0000ff&semi;">serializer<&sol;span><&sol;strong>&colon; <&sol;span>&nbsp&semi;tells DataStore the name of the serializer class&period;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<h4 class&equals;"p1 wp-block-heading"><span style&equals;"color&colon; &num;000080&semi;"><b>Read from a Proto DataStore<&sol;b><&sol;span><&sol;h4>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"p1">Use&nbsp&semi;<span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s1">DataStore&period;data<&sol;span><&sol;strong><&sol;span> to read a <span class&equals;"s1">Flow<&sol;span> of the object or the appropriate property from your stored object&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted"><span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;reading Person object<&sol;strong><&sol;span>&NewLine;val user&colon; Flow&lt&semi;Person&gt&semi; &equals; dataStore&period;data&NewLine; &period;map &lbrace;&NewLine; it&NewLine; &rcub;&NewLine;&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;reading Person object property firstName<&sol;strong><&sol;span>&NewLine;<strong>&sol;&sol;val userName&colon; Flow&lt&semi;String&gt&semi; &equals; dataStore&period;data&NewLine; &sol;&sol; &period;map &lbrace;&NewLine; &sol;&sol; it&period;firstName&NewLine; &sol;&sol; &rcub;<&sol;strong><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<h4 class&equals;"p1 wp-block-heading"><span style&equals;"color&colon; &num;000080&semi;"><b>Write to a Proto DataStore<&sol;b><&sol;span><&sol;h4>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"p1">Proto DataStore provides an&nbsp&semi;<span style&equals;"color&colon; &num;008000&semi;"><strong><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;DataStore&num;updatedata"><span class&equals;"s1">updateData&lpar;&rpar;<&sol;span><&sol;a><&sol;strong><&sol;span> function that &nbsp&semi;gives you the current state of the data as an instance of your data type &lpar;Person&rpar; and update the stored object&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">suspend fun storeData&lpar;age&colon; Int&comma; fname&colon; String&comma; lname&colon; String&comma; isMale&colon; Boolean&rpar; &lbrace;<br> dataStore&period;updateData &lbrace; preference -&gt&semi; preference&period;toBuilder&lpar;&rpar;<br>&period;setAge&lpar;age&rpar;<br>&period;setFirstName&lpar;fname&rpar;<br>&period;setLastName&lpar;lname&rpar;<br>&period;setGender&lpar;isMale&rpar;&period;build&lpar;&rpar;<br> &rcub;<br>&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<h4 class&equals;"p1 wp-block-heading"><span style&equals;"color&colon; &num;000080&semi;"><b>Using Proto Data Store<&sol;b><&sol;span><&sol;h4>&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;<pre class&equals;"wp-block-preformatted">package com&period;c1ctech&period;jetpackprotodatastore&NewLine;&NewLine;import androidx&period;appcompat&period;app&period;AppCompatActivity&NewLine;import android&period;os&period;Bundle&NewLine;import androidx&period;lifecycle&period;Observer&NewLine;import androidx&period;lifecycle&period;asLiveData&NewLine;import androidx&period;lifecycle&period;lifecycleScope&NewLine;import kotlinx&period;android&period;synthetic&period;main&period;activity&lowbar;main&period;&ast;&NewLine;import kotlinx&period;coroutines&period;launch&NewLine;&NewLine;class MainActivity &colon; AppCompatActivity&lpar;&rpar; &lbrace;&NewLine; private lateinit var personDataStore&colon; PersonDataStore&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; personDataStore &equals; PersonDataStore&lpar;this&rpar;&NewLine;&NewLine;&NewLine; <strong><span style&equals;"color&colon;&num;04603e" class&equals;"has-inline-color">&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; <strong><span style&equals;"color&colon;&num;04603e" class&equals;"has-inline-color"> &sol;&sol;Stores the values<&sol;span><&sol;strong>&NewLine; lifecycleScope&period;launch &lbrace;&NewLine; personDataStore&period;storeData&lpar;age&comma; fname&comma; lname&comma; isMale&rpar;&NewLine; &rcub;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; observeData&lpar;&rpar;&NewLine; &rcub;&NewLine;&NewLine; private fun observeData&lpar;&rpar; &lbrace;&NewLine;&NewLine; personDataStore&period;user&period;asLiveData&lpar;&rpar;&period;observe&lpar;this&comma; Observer &lbrace;&NewLine; if &lpar;it &excl;&equals; null &amp&semi;&amp&semi; it&period;age &gt&semi; 0&rpar; &lbrace;&NewLine; tv&lowbar;fname&period;text &equals; it&period;firstName&NewLine; tv&lowbar;lname&period;text &equals; it&period;lastName&NewLine; tv&lowbar;age&period;text &equals; it&period;age&period;toString&lpar;&rpar;&NewLine; gender &equals; if &lpar;it&period;gender&rpar; "Male" else "Female"&NewLine; tv&lowbar;gender&period;text &equals; gender&NewLine;&NewLine; &rcub; else &lbrace;&NewLine; tv&lowbar;fname&period;text &equals; ""&NewLine; tv&lowbar;lname&period;text &equals; ""&NewLine; tv&lowbar;age&period;text &equals; ""&NewLine; tv&lowbar;gender&period;text &equals; ""&NewLine; &rcub;&NewLine; &rcub;&rpar;&NewLine; &rcub;&NewLine;&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul id&equals;"block-31495fd9-2e0f-4300-ab5b-50c597779adf" class&equals;"block-editor-rich-text&lowbar;&lowbar;editable block-editor-block-list&lowbar;&lowbar;block wp-block is-selected is-hovered rich-text wp-block-list"><li>In order to get the saved values in the activity from the DataStore&comma; we need to change the <strong><span style&equals;"color&colon; &num;008000&semi;">Flow&lt&semi;Person&gt&semi;<&sol;span><&sol;strong> to LiveData with <strong><span style&equals;"color&colon; &num;008000&semi;">&period;asLiveData&lpar;&rpar;<&sol;span>&nbsp&semi;<&sol;strong>and observe it&period;<&sol;li><&sol;ul>&NewLine;&NewLine;

Exit mobile version