DataStoreとSharedPreferences
DataStoreが現代的な選択肢である理由を学びます
「DataStoreとSharedPreferences」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。
小さな設定を保存する
ほとんどすべてのアプリには、ダークモードの切り替え、最後に使用したタブ、ユーザー名など、小さなデータを記憶する機能が必要です。これらは大規模なリレーショナルデータではなく、キーと値の形式の設定です。
Android では長年、この用途に SharedPreferences が使われてきました。現在推奨されている解決策は DataStore です。
SharedPreferences とは
SharedPreferences は、XML を基盤とするシンプルなキーと値のストアです。エディタを取得して値を設定し、保存します。
- 使いやすい
- フレームワークに組み込まれている
- UI スレッドをブロックする可能性がある同期 API
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
val dark = prefs.getBoolean("dark_mode", false)SharedPreferences の問題点
SharedPreferences には、実際にいくつかの弱点があります:
getX()による読み取りで呼び出し元のスレッド(多くの場合メインスレッド)がブロックされる可能性があるcommit()はディスク I/O を同期的に実行する- エラーを通知する組み込みの仕組みがない
- 型安全でもリアクティブでもない API である
DataStore の登場
DataStore は、Kotlin のコルーチンとFlowを基盤とする最新の代替手段です。ディスク処理をすべてメインスレッド以外で行い、データを監視可能なストリームとして公開します。
種類は 2 つあります:Preferences DataStore(キーと値)と Proto DataStore(型付きオブジェクト)です。
非同期を前提に設計されている
DataStore が UI をブロックすることはありません。読み取りは収集する Flow を通じて行い、書き込みはコルーチンから呼び出す suspend 関数です。
つまり、重い処理はバックグラウンドのディスパッチャで実行されるため、メインスレッド上でも設定の読み書きを安全に行えます。
val darkMode: Flow<Boolean> = dataStore.data
.map { prefs -> prefs[DARK_MODE_KEY] ?: false }リアクティブな更新
DataStore は Flow を公開するため、値が変わると UI が自動的に更新されます。SharedPreferences では、扱いにくい変更リスナーを登録する必要がありました。
Jetpack Compose では、フローを collectAsState() するだけで、更新のたびに画面が再コンポーズされます。
トランザクションと一貫性
DataStore の書き込みはトランザクションとして実行されます。更新は完全に成功するか完全に失敗するため、書き込み途中の値を読み取ることはありません。
また、同じプロセス内で複数の読み書きを行う場合も、データの一貫性が保証されます。
エラー処理
SharedPreferences は I/O の問題を黙って無視します。DataStore は問題を表面化します。読み取り時にフローを通じて IOException を発行でき、それを catch して復旧できます。
val settings: Flow<Settings> = dataStore.data
.catch { e ->
if (e is IOException) emit(emptyPreferences())
else throw e
}
.map { /* map to your model */ }DataStore が適さない場合
DataStore は、小規模または中規模のキーと値のデータや型付きデータに使用します。データベースではありません。
- 大規模なデータセット、クエリ、リレーション:Room を使用します
- ファイル、画像、メディア:ファイルシステムを使用します
- 少数の設定:DataStore を使用します
依存関係の追加
Preferences DataStoreを使用するには、モジュールのGradleファイルにartifactを追加します。Proto DataStoreには別のartifactがあります。
dependencies {
implementation("androidx.datastore:datastore-preferences:1.1.1")
}SharedPreferencesからの移行
すべてを一度に書き換える必要はありません。DataStoreにはSharedPreferencesMigrationが用意されており、初回読み取り時に既存の値を自動的にコピーできます。
val Context.dataStore by preferencesDataStore(
name = "settings",
produceMigrations = { context ->
listOf(SharedPreferencesMigration(context, "settings"))
}
)理解度チェック
DataStoreが推奨される理由を理解できているか確認しましょう。
まとめ
キーと値による設定において、DataStoreが最新の選択肢である理由を学びました。
- SharedPreferencesはメインスレッドをブロックする可能性があり、リアクティブではありません
- DataStoreはコルーチンと
Flowを使用して、安全な非同期アクセスを実現します - 適切なエラーハンドリングを備えたトランザクションとして書き込みを行います
- PreferencesとProtoの2種類があります
次は、preferencesDataStoreデリゲートを実際に使用します。
よくある質問
「DataStoreとSharedPreferences」レッスンは無料ですか?
はい。「DataStoreとSharedPreferences」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。
「DataStoreとSharedPreferences」で何を学びますか?
DataStoreが現代的な選択肢である理由を学びます ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「DataStoreとSharedPreferences」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- DataStoreとSharedPreferences
- Preferences DataStore
- 設定の読み書き
- Proto DataStore