見出し画像

「COMPOSE を用いた ANDROID アプリ開発の基礎」の学習支援⑲ -ユニット6パスウェイ3

皆さん、こんにちは!又はこんばんは!初めての方は初めまして!
Google Codelabsの「COMPOSE を用いた ANDROID アプリ開発の基礎」コースのお手伝いをする「りおん」です。
今回は、ユニット6「データの永続化」のパスウェイ3「DataStoreっでキーを使用してデータにアクセスし保存する」です。

この記事はCodelabsの補足を目的としているため、「COMPOSE を用いた ANDROID アプリ開発の基礎」コースで心配になった時、エラーが起きて詰まった時や、分からないことがあった時、軽く復習したい時に見てください!
また、目次を見て自分に必要なところだけ見るのをお勧めします!

この記事を作成するにあたり使用しているAndroid StudioのバージョンはGiraffeです。バージョンによってはUIが違うことがあるのでご了承ください。
また、2024年5月7日現在の「COMPOSE を用いた ANDROID アプリ開発の基礎」コースを参考にしています。


学習内容

DataStore

DataStoreは、単純で小規模なデータセットを保存できる優れた方法です。
これに対してRoomはリレーションデータのような複雑なデータセットや大規模なデータセットを保存するのに向いています。
つまり、設定やアプリの状態の保存に使われることが多いです。

今回のCodelabsではアプリの表示をグリッドにするかリストにするかというアプリの状態を記憶するために使用

Preference DataStore vs Proto DataStore

DataStoreは二種類あります。
1.Preference DataStore
2.Proto DataStore
Preference DataStoreはスキーマを定義することなく、キーと値のペアに基づいてデータの読み取りと書き込みをします。動画で出てきたSharedPreferencesの改良型です。
一方、Proto DataStoreはプロトコルバッファを使用してスキーマを定義しデータを保存します。

Preference DataStoreはキーへのアクセスが正しいものか確認できない(型安全ではない)という欠点があり、これを改善したものがProto DataStoreです。しかし、Proto DataStoreは実装が少し複雑であるため、型安全が必要かどうかを選択の判断基準にする必要があります。

参考
https://developer.android.com/codelabs/android-proto-datastore?hl=ja#0

Preference DataStoreの使用法

今回はリポジトリにPreference DataStoreを挿入しています。
つまり、リポジトリのパラメータにDataStoreがあります。

1.依存関係の追加
build.gradle.kts(Module :app)に以下のコードを追加

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

2.DataStoreの作成
新しいApplicationクラスを作成し、その中にDataStoreプロパティをpreferenceDataStoreデリゲートを使用して作成。

3.リポジトリを初期化
2で作成したdataStoreをパラメータとしてリポジトリを初期化。

4.AndroidManifestに先ほど作成したApplicationクラスを追加

5.DataStoreの値にアクセスするキーを定義
今回は値がbooleanであるため、companion objectの中でbooleanPreferenceKey()関数を使用してキーを定義。

6.DataStoreに書き込む
datastoreの値の作成、変更はedit()メソッドを使用。
editのラムダ内で先ほど定義したキーを使用。

7.DataStoreから読み取る
dataStoreのdataプロパティはPreferencesオブジェクトのFlowです。
Flowであるため更新が行われるたび新しいPreferencesオブジェクトが出力されますが、今回欲しいのはBooleanオブジェクトであるためmap関数を使用して変換しています。
また、値が存在しない場合を考慮してtrueをデフォルトにしています。

8.例外処理を追加する
データの読み取りの際に、ファイルが存在しない、ディスクに空きがないなどが原因でエラーが発生するとIOExceptionsがスローされます。
この例外をキャッチして処理するためにcatch{}演算子を使用します。
IOExceptionがある場合にemptyPreferences()を出力することで先ほど定義したデフォルト値を使用してマッピングをすることが出来ます。

参考
https://developer.android.com/codelabs/android-preferences-datastore?hl=ja#0

さいごに

今回もCodelabsでの学習お疲れさまでした!
今回はRoomを使わずに簡単なデータを保存するData Storeのお話でした。
パスウェイも残すところあと3つ。最後まで頑張りましょう!

この記事が気に入ったらサポートをしてみませんか?