Android Academy · レッスン

設定の読み書き

ユーザー設定を保存して監視します

レッスン 3/413 ステップ

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

読み取りと書き込み

キーを定義したら、中心となる操作はデータの読み取りと、editを使った書き込みです。読み取りはリアクティブに行われ、書き込みはsuspend関数です。

データのFlow

dataStore.dataはFlow<Preferences>です。書き込みを行うたびに、新しいPreferencesのスナップショットをFlowが発行するため、collectしている側は自動的に最新の状態を受け取れます。

val rawData: Flow<Preferences> = dataStore.data

単一の値をマッピングする

Preferencesオブジェクト全体が必要になることは、ほとんどありません。mapを使って1つのキーを取り出し、デフォルト値を適用します。

val darkMode: Flow<Boolean> = dataStore.data
    .map { prefs -> prefs[PrefKeys.DARK_MODE] ?: false }

読み取りエラーへの対処

ディスクの読み取りでIOExceptionが発生することがあります。mapの前にcatchを使用して空のpreferencesを発行し、Flowを継続させます。

val darkMode: Flow<Boolean> = dataStore.data
    .catch { e ->
        if (e is IOException) emit(emptyPreferences())
        else throw e
    }
    .map { it[PrefKeys.DARK_MODE] ?: false }

editによる書き込み

値を変更するには、edit suspend関数を呼び出します。ラムダの内部では、変更可能なpreferencesオブジェクトを受け取るので、そのオブジェクトにキーを設定します。ブロック全体が1つのトランザクションになります。

suspend fun setDarkMode(enabled: Boolean) {
    dataStore.edit { prefs ->
        prefs[PrefKeys.DARK_MODE] = enabled
    }
}

editはsuspend関数

editはsuspend関数なので、コルーチンから呼び出す必要があります。通常はViewModel内でviewModelScope.launchを使って呼び出します。これにより、書き込みがメインスレッド以外で行われることが保証されます。

fun toggleDarkMode(value: Boolean) {
    viewModelScope.launch {
        repository.setDarkMode(value)
    }
}

複数のキーを更新する

1つのeditブロックで複数のキーを設定できます。これらはアトミックにまとめてコミットされるため、監視側が更新途中の状態を確認することはありません。

dataStore.edit { prefs ->
    prefs[PrefKeys.USERNAME] = "ada"
    prefs[PrefKeys.DARK_MODE] = true
    prefs[PrefKeys.FONT_SIZE] = 16
}

値をインクリメントする

editの内部では、現在の値を読み取って新しい値を計算できます。起動回数のようなカウンターに便利です。

suspend fun incrementLaunchCount() {
    dataStore.edit { prefs ->
        val current = prefs[PrefKeys.LAUNCH_COUNT] ?: 0
        prefs[PrefKeys.LAUNCH_COUNT] = current + 1
    }
}

削除とクリア

1つのキーを削除するにはremoveを、ストアを消去するにはclearを使用します。どちらもeditブロック内で呼び出します。

dataStore.edit { prefs ->
    prefs.remove(PrefKeys.USERNAME)
}

dataStore.edit { prefs ->
    prefs.clear()
}

Composeでcollectする

Composableでは、collectAsStateWithLifecycle()を使ってViewModelのFlowをstateに変換します。設定が変更されるたびにUIが再コンポーズされます。

val darkMode by viewModel.darkMode.collectAsStateWithLifecycle(initial = false)

Switch(
    checked = darkMode,
    onCheckedChange = { viewModel.toggleDarkMode(it) }
)

読み取り・変更・書き込みのサイクル

一連の流れをまとめると、UIがFlow経由で読み取り、ユーザーが切り替え操作を行い、ViewModelがコルーチンを起動してeditを呼び出し、DataStoreが書き込みを行い、Flowが再び値を発行して、UIが再コンポーズされます。最初から最後まで完全にリアクティブです。

理解度チェック

読み取りと書き込みを理解できているか確認しましょう。

まとめ

これで設定を読み書きできるようになりました。

  • dataStore.dataはリアクティブなFlow<Preferences>です
  • mapは単一の値を取り出し、catchはI/Oエラーを処理します
  • dataStore.edit { }はコルーチンからアトミックに書き込みます
  • collectAsStateWithLifecycleがCompose UIを更新します

次は、Proto DataStoreを使った型付き構造化データです。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
36
レッスン
152

よくある質問

「設定の読み書き」レッスンは無料ですか?

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

「設定の読み書き」で何を学びますか?

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

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

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

「設定の読み書き」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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