データとファイルのストレージの概要

Android には、アプリデータを保存するためのいくつかのオプションがあります。選択できるソリューションは、データに必要な領域、保存する必要があるデータの種類、データがそのアプリ専用か、他のアプリやユーザーからアクセス可能か、といった特定のニーズにより異なります。

このページでは、Android で使用できるさまざまなデータ ストレージ オプションについて説明します。

  • 内部ファイル ストレージ: 端末のファイル システムにアプリのプライベート ファイルを保存します。
  • 外部ファイル ストレージ: 共有外部ファイルシステムにファイルを保存します。これは、通常は写真などの共有ユーザー ファイル用です。
  • 共有の環境設定: キーと値のペアでプライベート プリミティブ データを保存します。
  • データベース: プライベート データベースに構造化データを保存します。

外部ストレージ上の一部のファイルタイプを除き、これらのすべてのオプションは、アプリのプライベート データ用です。データは、そのままでは他のアプリからアクセスできません。ファイルを他のアプリと共有する場合は、FileProvider API を使用する必要があります。詳細については、ファイルの共有をご覧ください。

アプリのデータを他のアプリに公開する場合は、ContentProvider を使用できます。コンテンツ プロバイダを使用すると、データ(通常はデータベース)に対して選択したストレージ媒体に関係なく、他のアプリが使用できる読み取り / 書き込みアクセス権を完全に制御できます。詳細については、コンテンツ プロバイダをご覧ください。

内部ストレージ

デフォルトでは、内部ストレージに保存されたファイルはそのアプリのプライベート ファイルになり、それ以外のアプリはアクセスできません(ユーザーもアクセスできませんが、ルートアクセスがある場合はアクセスできます)。そのため、内部ストレージは、ユーザーが直接アクセスする必要のない内部アプリデータに適しています。ファイル システム上には、各アプリのプライベート ディレクトリがあり、アプリに必要なファイルを整理できます。

ユーザーがアプリをアンインストールすると、内部ストレージに保存されているファイルも削除されます。この動作のため、アプリに関係なく保持する必要があるデータの保存には内部ストレージを使用しないでください。たとえば、アプリでユーザーによる写真の撮影が許可されている場合、ユーザーはアプリのアンインストール後もその写真にアクセスできることを期待します。そのためには、代わりに MediaStore API を使用して、このようなタイプのファイルを適切なメディア コレクションに保存する必要があります。

詳細については、内部ストレージにファイルを保存する方法および MediaStore を使用して検索クエリから音楽を再生する方法をご覧ください。

内部キャッシュ ファイル

データを永続的に保存するのではなく一時的に保持する場合は、特別なキャッシュ ディレクトリを使用してデータを保存する必要があります。各アプリには、このようなファイル専用のプライベート キャッシュ ディレクトリがあります。端末の内部ストレージ領域が小さい場合、Android は領域を確保するためにこれらのキャッシュ ファイルを削除することがあります。ただし、これらのファイルをシステムがクリーンアップするものとは考えないほうがよいでしょう。常に自分でキャッシュ ファイルを管理して、適度な使用領域の上限(たとえば 1 MB)を超えないようにしてください。ユーザーがアプリをアンインストールすると、これらのファイルも削除されます。

詳細については、キャッシュ ファイルの作成方法をご覧ください。

外部ストレージ

すべての Android 端末は、ファイルの保存先として共有の「外部ストレージ」領域をサポートしています。この領域が外部と呼ばれるのは、アクセス可能であることが保証されないためです。ユーザーが外部ストレージ端末としてパソコンにマウントできるストレージ領域であり、物理的に取り外しできる場合もあります(SD カードなど)。外部ストレージに保存されたファイルは誰でも読み取り可能です。また、USB マスストレージからパソコンへのファイル転送を有効にすると、ユーザーがファイルを変更することもできます。

そのため、アプリで外部ストレージ内のファイルにアクセスする前に、外部ストレージ ディレクトリおよびアクセス使用としているファイルが使用可能かどうかを確認する必要があります。

ほとんどの場合、他のアプリからアクセス可能で、ユーザーがアプリをアンインストールしても保存されているユーザーデータ(撮影した写真やダウンロードしたファイルなど)には外部ストレージを使用します。このようなファイルのために標準のパブリック ディレクトリも用意されているため、ユーザーは 1 か所にすべての写真、着信音、音楽などを保管できます。

ユーザーがアプリをアンインストールすると削除される外部ストレージのアプリ固有のディレクトリにファイルを保存することもできます。これは、多くの領域が必要な場合に内部ストレージの代わりに使用できるため便利です。ただし、ユーザーはストレージ SD カードを取り外す場合があるため、ファイルへのアクセスは保証されません。この場合もファイルは誰でも読み取り可能です。他のアプリと共有されていない場所に保存されているだけです。

詳細については、外部ストレージにファイルを保存する方法をご覧ください。

共有の環境設定

多くのデータを保存する必要がなく、構造も不要な場合は SharedPreferences を使用してください。SharedPreferences API を使用すると、boolean、float、int、long、string などのプリミティブ データ型の永続的なキーと値のペアを読み書きできます。

キーと値のペアは、アプリを強制終了してもユーザー セッションをまたがって保持される XML ファイルに書き込まれます。ファイルの名前を手動で指定したり、アクティビティごとのファイルを使用してデータを保存したりできます。

API 名「SharedPreferences」は、誤解を招く場合があります。この API は、厳密にはユーザーが選択した着信音などの「ユーザー設定」を保存するためのものではありません。SharedPreferences を使用して、ユーザーのハイスコアなどの単純なデータを保存できます。ただし、アプリのユーザー設定を保存する場合は、設定の UI を作成する方法をご覧ください。AndroidX Preference Library を使用して設定画面をビルドし、ユーザーの設定を自動的に保持します。

キー値データを保存する方法については、SharedPreferences を使用したキー値データの保存をご覧ください。

データベース

Android は、SQLite データベースを完全にサポートしています。作成したデータベースには、アプリでのみアクセスできます。ただし、SQLite API を直接使用する代わりに、Room 永続ライブラリを使用してデータベースを作成し、操作することをお勧めします。

Room ライブラリは、SQLite のすべてのパワーを活用しつつ柔軟にデータベースにアクセスできるオブジェクト マッピング抽象化レイヤーを提供します。

この方法でも SQLite で直接データを保存できますが、SQLite API はかなり低レベルであるため、使用するにはかなりの時間と労力が必要です。次に例を示します。

  • ロー SQL クエリはコンパイル時に検証されません。
  • スキーマが変更されると、影響を受ける SQL クエリを手動でアップデートする必要があります。これは、時間がかかり、エラーも発生しやすいプロセスです。
  • SQL クエリと Java データ オブジェクトを変換するために、たくさんのボイラープレート コードを書く必要があります。

Room 永続ライブラリは SQLite に抽象化レイヤーを提供し、こういった懸念に対処します。

Room の使用方法を示すサンプルアプリについては、GitHub で次のサンプルをご覧ください。

データベースのデバッグ

Android SDK には、sqlite3 データベース ツールが含まれており、SQLite データベースでテーブル コンテンツをブラウジングしたり、SQL コマンドを実行したり、その他便利な関数を実行できます。詳細については、adb のドキュメントをご覧ください。

参考資料

データ ストレージの詳細については、次のリソースをご覧ください。

コードラボ