「DataStore」はAndroid Jetpackで提供されているAPIです。
永続的なデータを保存するための仕組みです。
「SharedPreferences」の代替ツールとして登場し、「SharedPreferences」に代わって使用が推奨されています。
ここでは「DataStoreの概要」について、まとめます。
※環境:Android Studio Hedgehog | 2023.1.1 Patch 2
DataStore
アプリケーションで扱うデータをファイルへ入出力することは、よくある動作です。
この時、後々のデータの読み書きを考えると、ファイルは定まったフォーマットにします。なぜなら、不明なフォーマットで書き込まれていたら、データが正しく読み込めないからです。
フォーマットはアプリケーション固有のもの、XML・TOMLといったテキストのもの、JPEG・PNG(画像)といったバイナリのものなど、様々です。
※TOML:Gradleのバージョンカタログで使用
DataStoreはデータを「識別子と値のペア」で記録します。
データベースのテーブル(二次元の表)と違って、一次元のデータ列です。ある時点の一対のデータ(識別子と値)しか持てません。
ですので、「アプリの設定(状態)」などの保存に適します。
識別子を表現する方法の違いで、Preferences DataStoreとProto DataStoreの2つがあります。
Preferences DataStore
キー(文字列)を識別子にしたDataStoreです。
キーを指定して、データのアクセスを行います。
データはPreferencesクラス内にPairクラスで格納されています。
値の型(Int型、String型など)はキーに関連付けられています。ですので、使用するキーにより、ペアになる値の型が決まります。
Proto DataStore
カスタムデータクラス(図のYYY)のフィールドを識別子にしたDataStoreです。
フィールドを参照して、データのアクセスを行います。
データはデータクラスのフィールドに格納されています。
値の型はフィールドの型です。
なお、Proto DataStoreはgRPC(google Remote Proceduer Call)で採用されている「Protocol Buffers(インターフェース定義)」の一部を利用しています。
非同期でアクセス
DataStoreは、コルーチンとFlowを使った非同期のアクセス環境をユーザに提供します。
ストリームデータはPreferences(Proto DataStoreの場合はカスタムデータクラス)のオブジェクトです。
ファイルが更新される度に、新しいデータが送られてきます。ですので、DataStore配下のデータは、常に最新の状態を保てます。
ファイルが更新されない期間のスレッドは休止されます。
PreferencesとProtoの比較
PreferencesとProto DataStoreの比較です。
※CodeLab「4. DataStore – 基本事項」から抜粋
両者の機能(出来ること)に、大きな違いはありません。
ただし、プログラミングの手数(労力)を比べると、Proto DataSotreの方が大きいです。これは「Protocol Buffers」の利用が影響しています。
Protcol Buffersで必要なこと- ★proto3(IDL)の理解
- ★protoスキーマの定義(***.protoファイルの作成)
- ★カスタムデータクラスの自動作成
- ・プラグインの指定が必要
- ・ライブラリの指定が必要
- ★シリアライザーを実装
また、ドキュメントに次のようなProto DataStoreの利点が述べられています。
「Protobuf(Protocol Buffers)を使用すると、厳密に型付けされたデータを保持できます。XMLやその他類似のデータ形式よりも、高速で小さくシンプル、かつ具体的です。」
以上より、DataStoreを利用する場合、PreferencesとProtoのどちらを採用しても問題ありませんが、次のような傾向があると思います。
要件 | Preferenceが適する | Protoが適する |
---|---|---|
データ数 | 少ない | 多い |
アクセス頻度 | 少ない | 多い |
手軽・簡素 | 〇 | × |
関連記事: