Androidアプリ開発をしていると、
「設定値やフラグ、どこに保存すればいいんだっけ?」
と迷う場面が必ず出てきます。
昔からよく使われてきたのが SharedPreferences ですが、
最近は DataStore が公式に推奨されるようになり、
「結局どっちを使うのが正解なの?」と悩む方も多いはずです。
この記事では、
SharedPreferences と DataStore の違いを整理しつつ、
実務での正しい使い分けを初心者にも分かるように解説します。
SharedPreferences とは?
SharedPreferences は、
キーと値のペアでデータを保存できる、Androidで最も古くから使われている仕組みです。
主に以下のような用途で使われてきました。
- ログイン状態のフラグ
- 初回起動判定
- 簡単な設定値(ON / OFF)
SharedPreferences の特徴
- 実装が簡単
- 同期的に読み書きできる
- XMLファイルとして保存される
一方で、
現在ではいくつか問題点も指摘されています。
SharedPreferences の問題点
① メインスレッドでのI/Oが発生しやすい
SharedPreferences は同期処理が基本です。
そのため、使い方によってはメインスレッドで I/O が走り、
パフォーマンス低下や ANR の原因になります。
② データ破損のリスク
同時書き込みが発生した場合などに、
XML が壊れてデータが読めなくなるケースがあります。
③ 型安全ではない
キーを文字列で扱うため、
タイプミスやキー変更によるバグが起きやすいのも欠点です。
DataStore とは?
DataStore は、
SharedPreferences の後継として Google が公式に推奨している仕組みです。
内部的には Kotlin Coroutine と Flow をベースにしており、
非同期・安全・一貫性のあるデータ保存を実現しています。
DataStore の種類
- Preferences DataStore(キー・バリュー形式)
- Proto DataStore(型安全・Protocol Buffers)
初心者の方は、まずは Preferences DataStore を使うケースが多いです。
Preferences DataStore の基本例
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(
name = "settings"
)
値の保存:
val IS_LOGIN = booleanPreferencesKey("is_login")
context.dataStore.edit { prefs ->
prefs[IS_LOGIN] = true
}
値の取得:
val isLoginFlow: Flow<Boolean> =
context.dataStore.data.map { prefs ->
prefs[IS_LOGIN] ?: false
}
Flow と組み合わせることで、
値の変更をリアルタイムに監視できるのが大きな特徴です。
SharedPreferences と DataStore の比較
| 項目 | SharedPreferences | DataStore |
|---|---|---|
| 処理方式 | 同期 | 非同期(Coroutine / Flow) |
| 安全性 | 低め | 高い |
| 型安全 | なし | あり(特にProto) |
| 公式推奨 | 非推奨ではないが旧式 | 推奨 |
実務での正しい使い分け
SharedPreferences を使ってもよいケース
- 既存アプリの保守
- 一時的なフラグ保存
- すでに大規模に使われている場合
DataStore を使うべきケース
- 新規開発
- 設定値が増える予定がある
- 状態管理を Flow で扱っている
- 将来的な保守性を重視したい
結論としては、新規なら DataStore を選んでおくのが無難です。
よくある質問
Q. SharedPreferences はもう使わない方がいい?
完全に禁止されているわけではありません。
ただし、新規実装では DataStore を選ぶのが推奨されています。
Q. DataStore は難しくない?
最初は Flow に慣れが必要ですが、
一度使うと SharedPreferences には戻れなくなる便利さがあります。
まとめ
SharedPreferences と DataStore は、
「同じ用途に見えて、思想がまったく違う仕組み」です。
今後の Android 開発では、
安全性・非同期・保守性を考えると DataStore が中心になっていきます。
どちらを使うか迷ったときは、
「新規か既存か」「将来の拡張性」を基準に判断するのがおすすめです。



コメント