minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

Android では、全てのアプリケーションデータ(ファイルも含む)は
そのアプリケーションに private となります。
つまり、他のアプリからそのデータを見ることができません。

一方、Android はそのデータを外部へ提供する汎用的なコンポーネントを持っています。
これを Content Provider と呼びます。
詳しくは、Content Provider について のページを読んで下さい。

あなたは、アプリケーションのデータを他へ公開する・しないに関わらず
データを保管する方法について知りたいはずです。
Android では、4種類のデータ格納・読み込みメカニズムを用意しています。
Preferences, Files, Databases, Network です。

以下、それぞれについて紹介します。

Preferences

Preferences は、key-value のペアで値を扱う簡易的なメカニズムです。
プロパティファイルと言えばわかりやすいでしょうか。

ここには、アプリケーション起動時に使われる一般的な設定を格納することが多いです。
例えば、デフォルトフォント設定やグリーティング文字などです。

Context.getSharedPreferences(name) で指定名称のストレージを取得したら、あとはこれに対して
自由に Read / Write を行うことができます。
または getPreferences() を使って汎用的なストレージを取得することもできます。
getPreferences() は、getSharedPreferences(getClass().getName()) と同じです。

いずれにしても、Preferences を他のアプリケーションと共有することはできません。
SharedPreferences という名前が紛らわしいですが、そういう事のようです。

Read 方法は簡単です。

boolean silent = settings.getBoolean("silentMode", false);

第二引数は、値が存在しなかった場合のデフォルト値を意味します。

Write 方法は、それよりちょっと複雑です。

SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
editor.commit();

このように、edit() で編集用のインスタンスを取得して、それに対して更新処理を行います。
最後に commit() を呼び出すのを忘れないように。

Files

ファイルを使ってデータのやりとりをします。
デフォルトでは、他のアプリケーションからこれらのファイルにアクセスすることはできません。

Context.openFileInput(name) によって、ファイルを開いて InputStream を取得することができます。
ファイルに書き込むには Context.openFileOutput(name) を呼び出して OutputStream を取得します。
このときの name は、アプリケーションルートからの相対パスになります。
従って、他のアプリケーションのファイルを読み書きすることはできません。

もしコンパイル時(実行前)にファイルを用意する場合
res/raw/myDataFile にファイルを配置しておきましょう。
こうすると、プログラム内から Resources.openRawResource(R.raw.myDataFile) を呼び出すことで
このファイルへの InputStream を取得することができます。

Databases

Android は、SQLite データベースのAPIを持っています。
それぞれのデータベース(スキーマ)は、各アプリケーションで独立しています。
よって、これも他のアプリケーションからアクセスすることはできません。

SQLiteDatabase クラスが、一つのスキーマに対応するインスタンスとなります。
このスキーマに関する処理(SELECT や CREATE TABLEなど)は全てこのインスタンスから行えます。
最初にスキーマを作る場合は、SQLiteDatabase.create() メソッドを呼び出して下さい。

Android では、複雑な Java オブジェクトと SQLite のデータを O/Rマッピングする機能を持っています。
SQLite やその他のデータベースのデータは、デバイスの /data/data/package_name/databases に格納されます。

Android は、SQLite に関して全く制限を設けていません。
つまり、いくつのテーブル数を作れるかとか、カラムはいくつ持てるだとかいう点については
SQLite の仕様がそのまま適用されます。
Android では、Auto Increment で自動生成される ID カラムをテーブルの Primary Key にすることを薦めます。

これは Android に限らず最近ではほとんどの場面で一般的となっている概念です。

あるスキーマで定義したテーブルには、そのアプリケーション内のどのクラスからもアクセスできます。
しかし前述したように、他のアプリケーションからは一切アクセスすることができません。

Network

一般的なJavaプログラムと同じ方法で、ネットワーク経由でデータのやりとりができます。
これについては、他の文書を参照して下さい。

Storage の外部公開

Preferences, Files, Databases の Storage は、Manifest File の設定によっては外部に公開することができます。
セキュリティ、Permission について のページを参考にして下さい。
読み取り専用による公開も可能です。

しかし、これらにはセキュリティ上の危険があることも十分承知した上で使って下さい。