SharedPreferences と DataStore の違いと正しい使い分け【Android】

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 の比較

項目SharedPreferencesDataStore
処理方式同期非同期(Coroutine / Flow)
安全性低め高い
型安全なしあり(特にProto)
公式推奨非推奨ではないが旧式推奨

実務での正しい使い分け

SharedPreferences を使ってもよいケース

  • 既存アプリの保守
  • 一時的なフラグ保存
  • すでに大規模に使われている場合

DataStore を使うべきケース

  • 新規開発
  • 設定値が増える予定がある
  • 状態管理を Flow で扱っている
  • 将来的な保守性を重視したい

結論としては、新規なら DataStore を選んでおくのが無難です。


よくある質問

Q. SharedPreferences はもう使わない方がいい?

完全に禁止されているわけではありません。
ただし、新規実装では DataStore を選ぶのが推奨されています。

Q. DataStore は難しくない?

最初は Flow に慣れが必要ですが、
一度使うと SharedPreferences には戻れなくなる便利さがあります。


まとめ

SharedPreferences と DataStore は、
「同じ用途に見えて、思想がまったく違う仕組み」です。

今後の Android 開発では、
安全性・非同期・保守性を考えると DataStore が中心になっていきます。

どちらを使うか迷ったときは、
「新規か既存か」「将来の拡張性」を基準に判断するのがおすすめです。

コメント

タイトルとURLをコピーしました