Jetpack DataStore を仕事で使った

  • tech

Jetpack DataStore は、去年 Stable になったライブラリの一つで SharedPreferences を置き換えるように設計されています。protocol buffers で任意の型を保存できる Proto DataStore もありますが、今回はプリミティブ型を格納するPreferences DataStore を使いました。

DataStore | Android Developers

公式ブログの方で SharedPreferences との比較表があって、Jetpack DataStore があたかも優れているように紹介されています。正直 Jetpack DataStore をあえて利用したい気持ちはないですが、将来的に SharedPreferences を置き換えたい計画があるみたいなので、新規で Key-Value Store みたいなものが使いたくなった時は Jetpack DataStore を利用するのが無難かもしれません。

SharedPrefとDataStoreの比較表

Android Developers Blog: Prefer Storing Data with Jetpack DataStore

読み込みと書き込み

// データストアへのアクセス
private val Context.dataStore by preferencesDataStore(name = "debug_data_store")

// 読み込み
val key = booleanPreferencesKey("key")
val value: Flow<Boolean> = context.dataStore.data.map { it[key] ?: false }

// 書き込み
val key = booleanPreferencesKey("key")
context.dataStore.edit { it[key] = isEnabled }

読み込みや書き込みの型の指定は key の定義で伝えるインターフェースになっています。

  • intPreferencesKey
  • doublePreferencesKey
  • stringPreferencesKey
  • booleanPreferencesKey
  • floatPreferencesKey
  • longPreferencesKey
  • stringSetPreferencesKey

書き込みは suspend 関数になっていて、読み込みは Flow で返ってきます。どうしても suspend 関数や Flow の形が扱いづらかったら runBlocking で囲んで同期的に処理する方法が公式に紹介されています。
これまで Flow で返ってくる API にあんまり馴染みがなかったんですが、Jetpack Compose を View に使っている場合は Flow で受け取って collectAsState(defaultValue) で State に変換できるので比較手に扱いやすかったです。