DataStoreの概要

投稿日:  更新日:

「DataStore」はAndroid Jetpackで提供されているAPIです。

永続的なデータを保存するための仕組みです。

「SharedPreferences」の代替ツールとして登場し、「SharedPreferences」に代わって使用が推奨されています。

ここでは「DataStoreの概要」について、まとめます。

※環境:Android Studio Hedgehog | 2023.1.1 Patch 2

スポンサーリンク

DataStore

アプリケーションで扱うデータをファイルへ入出力することは、よくある動作です。

この時、後々のデータの読み書きを考えると、ファイルは定まったフォーマットにします。なぜなら、不明なフォーマットで書き込まれていたら、データが正しく読み込めないからです。

アプリの出力フォーマット

フォーマットはアプリケーション固有のもの、XML・TOMLといったテキストのもの、JPEG・PNG(画像)といったバイナリのものなど、様々です。
※TOML:Gradleのバージョンカタログで使用

DataStoreはデータを「識別子と値のペア」で記録します。

DataStoreのデータフォーマット

データベースのテーブル(二次元の表)と違って、一次元のデータ列です。ある時点の一対のデータ(識別子と値)しか持てません。

ですので、「アプリの設定(状態)」などの保存に適します。

DataStoreの用途

識別子を表現する方法の違いで、Preferences DataStoreとProto DataStoreの2つがあります。

スポンサーリンク

Preferences DataStore

キー(文字列)を識別子にしたDataStoreです。

キーを指定して、データのアクセスを行います。

Preferences DataStoreのデータ管理イメージ

データはPreferencesクラス内にPairクラスで格納されています。

値の型(Int型、String型など)はキーに関連付けられています。ですので、使用するキーにより、ペアになる値の型が決まります。

スポンサーリンク

Proto DataStore

カスタムデータクラス(図のYYY)のフィールドを識別子にしたDataStoreです。

フィールドを参照して、データのアクセスを行います。

Proto DataStoreのデータ管理イメージ

データはデータクラスのフィールドに格納されています。

値の型はフィールドの型です。

なお、Proto DataStoreはgRPC(google Remote Proceduer Call)で採用されている「Protocol Buffers(インターフェース定義)」の一部を利用しています。

スポンサーリンク

非同期でアクセス

DataStoreは、コルーチンとFlowを使った非同期のアクセス環境をユーザに提供します。

ストリームデータはPreferences(Proto DataStoreの場合はカスタムデータクラス)のオブジェクトです。

DataStoreの非同期環境

ファイルが更新される度に、新しいデータが送られてきます。ですので、DataStore配下のデータは、常に最新の状態を保てます。

ファイルが更新されない期間のスレッドは休止されます。

スポンサーリンク

PreferencesとProtoの比較

PreferencesとProto DataStoreの比較です。
※CodeLab「4. DataStore – 基本事項」から抜粋

両者の機能(出来ること)に、大きな違いはありません。

PreferencesとProto DataStoreの比較

ただし、プログラミングの手数(労力)を比べると、Proto DataSotreの方が大きいです。これは「Protocol Buffers」の利用が影響しています。

 Protcol Buffersで必要なこと 
  • ★proto3(IDL)の理解
  • ★protoスキーマの定義(***.protoファイルの作成)
  • ★カスタムデータクラスの自動作成
  •   ・プラグインの指定が必要
  •   ・ライブラリの指定が必要
  • ★シリアライザーを実装

また、ドキュメントに次のようなProto DataStoreの利点が述べられています。

「Protobuf(Protocol Buffers)を使用すると、厳密に型付けされたデータを保持できます。XMLやその他類似のデータ形式よりも、高速で小さくシンプル、かつ具体的です。」

以上より、DataStoreを利用する場合、PreferencesとProtoのどちらを採用しても問題ありませんが、次のような傾向があると思います。

要件Preferenceが適するProtoが適する
データ数少ない多い
アクセス頻度少ない多い
手軽・簡素×
スポンサーリンク

関連記事:

Preferences DataStoreの使い方を、まとめます。 DataStoreはPreferencesとProto DataStoreの2つがあります。 Preferences DataStoreは、データの識別子にキー(文字列)を使うタイプです。 手軽・簡素で、Proto DataStoreに比べて、使い勝手がよいです。 あえて、Proto DataStoreを使う理由が無いのであれば、Preferences DataStoreで十分です。 ※環境:Android Studio Hedgehog | 2023.1.1 Patch 2     androidx.datastore:datastore-preferences:1.1.7 ...
Proto DataStoreの使い方を、まとめます。 DataStoreはPreferencesとProto DataStoreの2つがあります。 Proto DataStoreは、データの識別子にカスタムデータクラスのフィールドを使うタイプです。 カスタムデータクラスはprotoスキーマの定義から自動生成される仕組みになっています。 このカスタムデータクラスの作成に一手間かかるため、使い勝手はPreference DataStoreよりも劣ります。 あえて、Proto DataStoreを使う理由が無いのであれば、Preferences DataStoreで十分です。 ※環境:Android Studio Hedgehog | 2023.1.1 Patch 2     com.google.protobuf 0.9.5     androidx.datastore:datastore:1.1.7     com.google.protobuf:protobuf-javalite:4.32.0 ...
スポンサーリンク