0Pricing
Android Academy · レッスン

Preferences DataStore

キーと値の設定をリアクティブに保存します

「Preferences DataStore」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。

Preferences DataStore

Preferences DataStoreは、SharedPreferencesと同様に単純なキーと値のペアを保存しますが、最新の非同期APIを備えています。オブジェクト全体に対するスキーマや型安全性は強制されません。

値には型付きのキーを使ってアクセスします。

DataStoreの作成

KotlinファイルのトップレベルでpreferencesDataStoreプロパティデリゲートを使用すると、ファイルごとに1つのDataStoreインスタンスを作成できます。nameはディスク上のファイル名になります。

import androidx.datastore.preferences.preferencesDataStore
import androidx.datastore.preferences.core.Preferences

val Context.dataStore: DataStore<Preferences> by
    preferencesDataStore(name = "settings")

トップレベルデリゲートを使う理由

このデリゲートにより、プロセス内でそのファイル名に対応するDataStoreインスタンスが1つだけになることが保証されます。同じファイルに対して2つ作成すると、同じデータをめぐって競合するためエラーが発生します。

トップレベルのContext拡張として宣言することで、シングルトンとして維持できます。

Preferenceキー

各値には型付きキーが必要です。キーはエントリの名前を指定すると同時に、その型を固定します。各サポート対象の型に対応するキーは、ヘルパー関数で作成できます。

import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.intPreferencesKey

val USERNAME = stringPreferencesKey("username")
val DARK_MODE = booleanPreferencesKey("dark_mode")
val LAUNCH_COUNT = intPreferencesKey("launch_count")

サポートされるキーの型

Preferences DataStoreは、次のプリミティブ型のキーをサポートしています。

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

キーを1か所で定義する

よく使われる方法は、すべてのキーをobjectにまとめることです。これによりキーを見つけて再利用しやすくなり、文字列名の入力ミスも防げます。

object PrefKeys {
    val USERNAME = stringPreferencesKey("username")
    val DARK_MODE = booleanPreferencesKey("dark_mode")
    val FONT_SIZE = intPreferencesKey("font_size")
}

文字列キーと変数名の違い

文字列の引数(例: "dark_mode")がディスクに書き込まれる値であることに注意してください。後からこれを変更すると、以前の値にアクセスできなくなります。Kotlinのval名は、コード内で使用する名前にすぎません。

用途ごとに1つのDataStore

用途が異なる場合は、ファイル名をそれぞれ変えて複数のDataStoreを作成できます。たとえば、"settings"ストアと"user_session"ストアを作成できます。関連するキーはまとめて管理してください。

val Context.settingsStore by preferencesDataStore(name = "settings")
val Context.sessionStore by preferencesDataStore(name = "session")

UIレイヤーからのアクセス

デリゲートはContextに付属しますが、Composableから直接読み取らないでください。DataStoreをrepositoryに注入し、そこからViewModelにFlowを公開します。これによりUIをテストしやすくなります。

シンプルなRepositoryの構成

DataStoreをrepositoryクラスでラップすると、すっきりしたAPIを提供でき、キーの定義とマッピングロジックを1か所にまとめられます。

class SettingsRepository(private val dataStore: DataStore<Preferences>) {
    val darkMode: Flow<Boolean> = dataStore.data
        .map { it[PrefKeys.DARK_MODE] ?: false }
}

デフォルト値

キーがまだ存在しない場合があるため、読み取り結果はnullになります。Preferenceの値をマッピングするときは、Elvis演算子?:を使って必ずデフォルト値を指定してください。

val fontSize: Flow<Int> = dataStore.data
    .map { prefs -> prefs[PrefKeys.FONT_SIZE] ?: 14 }

理解度チェック

Preferenceキーを理解できているか確認しましょう。

まとめ

Preferences DataStoreを設定しました。

  • トップレベルのpreferencesDataStoreデリゲートで1つのインスタンスを作成する
  • stringPreferencesKey、booleanPreferencesKeyなどで型付きキーを定義する
  • キーをobjectにまとめ、アクセスをrepositoryでラップする
  • 存在しないキーには必ずデフォルト値を指定する

次は、これらの設定を実際に読み書きします。

よくある質問

「Preferences DataStore」レッスンは無料ですか?

はい。「Preferences DataStore」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。

「Preferences DataStore」で何を学びますか?

キーと値の設定をリアクティブに保存します ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Preferences DataStore」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DataStoreとSharedPreferences
  2. Preferences DataStore
  3. 設定の読み書き
  4. Proto DataStore
← Android Academyに戻る