この一連のチュートリアルでは、Android SDK 開発をゼロから始める方法を学びます。リソース、マニフェスト、ユーザーインターフェイスなど、Android アプリケーションの構造や基本的なコンポーネントについては、すでにご存知のことと思います。Android プラットフォーム上で機能的なアプリケーションの開発を開始した後、何らかの方法でデータを保存する必要があります。Android プラットフォームは、アプリケーション内のデータ保存タスクを処理するためのさまざまなオプションを提供しています。
挙げる
大まかに言えば、Androidアプリのデータ保存オプションには、アプリの共有設定にデータを保存する、内部ストレージに保存する、外部ストレージに保存する、データベースに保存する、デバイスのインターネット接続を介してアクセス可能なWebリソースに保存する、という5つの主要なタイプがあります。スペースがないため、これらのオプションについて詳しく説明することはできませんが、永続データを使用する必要がある場合にストレージの問題を理解するのに役立つように、それぞれの基本的な特徴を概説します。
1.好みの共有
***ステップ
共有環境設定によって、誰もが基本的なデータ型をキーと値のペアの形で保存することができます。アプリケーションの共有環境設定ファイルは、最も単純なデータ保存オプションと思われがちですが、本質的には、保存できるオブジェクトにある程度の制限を課しています。基本的な型である数値、ブーリアン値、テキスト文字列を保存するために使用することができます。保存する各値には、アプリケーションの実行時に取得できるように名前を割り当てる必要があります。あなたが作成する***アプリケーションでは、共有環境設定を使用する可能性が高いので、より詳細な方法でそれを提示することによって、必要な知識を統合するのを助けるために、このプレゼンテーションの焦点にしました。
このコードを自分のメインのアクティビティクラスで試し、後でこのチュートリアルシリーズのアプリケーション例を実行するときにテストすることができます。理想的には、外観設定を選択するように、共有環境設定がアプリケーションのユーザー設定可能なオプションに適合できるようにすることです。ユーザーがクリックすると画面に「痛い」というテキストを表示する単純なボタンを作成したことを思い出してください。ここで、ユーザがボタンを一度クリックした後も「痛い」という文字を表示し続け、その状態がアプリケーションの間ずっと変わらないようにしたいとします。つまり、ボタン上の初期テキストは、ユーザーが***クリックしたときだけ存在することになります。
アプリケーションに共有プリファレンスのコンテンツを追加しましょう。クラスの最初にある onCreate メソッドで、共有プリファレンスの名前を選びます:
public static final String MY_APP_PREFS = "MyAppPrefs"; 
public static "修飾子によって、この変数はアプリケーション内のどのクラスでもアクセスできるようになります。変数が大文字なのは定数だからで、"final "修飾子はそのためにあります。アプリケーションの環境設定でデータエントリーを取得したり設定したりするときは、誰もが毎回同じ名前を使わなければなりません。
だんかい
では、共有プリファレンスの内容を書いてみましょう。onClickメソッドで、ボタンの「痛い」テキスト設定部分の下に、この共有プリファレンスを名前で取得してみます:
SharedPreferences thePrefs = getSharedPreferences(MY_APP_PREFS, 0); 
android.content.SharedPreferences "クラスのインポートを追加する必要があります。SharedPreferences "テキストにカーソルを合わせ、Eclipseのプロンプトを使ってインポートを完了させてください。パラメータ *** は定義されたプリファレンスの名前、2番目はデフォルトオプションとしてのベースモードです。
共有プリファレンスの値の設定を可能にするために、共有プリファレンスのエディターセットを指定する必要があります:
SharedPreferences.Editor prefsEd = thePrefs.edit(); 
これで共有環境設定に値を書き込むことができます:
prefsEd.putBoolean("btnPressed", true);
ここでBoolean型が使われるのは、現在の状態が2つしかないからです。エディターには、共有されたプリファレンスのセットを保存するために選択できる多くの異なる型が用意されており、各メソッドには独自の名前と値のパラメータがあります。*** 編集は送信する必要があります:
prefsEd.commit(); 
第三段階
では、すでに保存されている値を使用して、ユーザーがアプリケーションを実行した後にボタンが表示する内容を検出しましょう。onCreateの既存のコードの後に、共有環境設定を追加します:
SharedPreferences thePrefs = getSharedPreferences(MY_APP_PREFS, 0); 
今回は1つの値だけを取り出せばよいので、エディタを使う必要はありません:
boolean pressed = thePrefs.getBoolean("btnPressed", false); 
ここで、設定されている名前を使用して値を取得し、その結果を変数に読み込みます。値がまだ設定されていない場合、返されるのはデフォルト値である2番目のパラメータです。この値を使用します:
if(pressed) theButton.setText("Ouch"); 
アプリケーションの実行後にユーザーがボタンを押すと、ボタンに直接「痛い」という文字が表示されます。このシリーズの後の記事で、アプリの実行中にこれが行われるのを見ることができます。この単純な例は、共有環境設定の使い方をよく表しています。おわかりのように、共有環境設定は、アプリがルック&フィールの面でユーザーの好みに対応するのに重要な役割を果たします。
2.個人所有の内部文書
***ステップ
ユーザーの端末では、内部ストレージと外部ストレージの両方にファイルを保存できます。内部ストレージにファイルを保存した場合、Androidはそのファイルを現在のアプリケーション専用のプライベートデータとして扱います。これらのファイルは基本的にアプリケーションの一部であり、アプリケーションの外からアクセスすることはできません。さらに、アプリケーションが削除されると、これらのファイルも空になります。
以下の出力ルーチンを使って、メモリ・ストレージにファイルを作成することができます:
FileOutputStream fileOut = openFileOutput("my_file", Context.MODE_PRIVATE); 
java.io.FileOutputStream」クラスのインポートを追加する必要があります。FileOutputStream "クラスのインポートを追加します。 ファイルの名前とモードを指定し、privateモードを選択すると、そのファイルはアプリケーションによってのみ使用されます。この部分をonClickメソッドなどのActivityに追加すると、Eclipseはエラー・メッセージを表示します。これは、入出力操作を実行する際に、アプリケーションが対処すべきエラーに遭遇する可能性があるためです。入出力操作でこれらのエラーを解決できない場合、Eclipse は例外を表示し、アプリケー ションを中断します。このような場合でもアプリケーションが正常に実行できるように、入出力コードを try ブロックにカプセル化する必要があります:
try{     FileOutputStream fileOut = openFileOutput("my_file", Context.MODE_PRIVATE); 
} catch(IOException ioe){     
Log.e("APP_TAG", "IO Exception", ioe); } 
入出力操作の結果、例外が発生した場合、catchブロック内の上記のコードが実行され、エラーメッセージがログに書き込まれます。コードが実行されたときに何が起こったかを記録するために、今後アプリケーションで Log クラスをよく使うことになるでしょう。上記のコードで***バーのパラメータである文字列タグのクラス変数を定義することができます。こうすることで、エラーが発生したときにAndroid LogCatで例外情報を見ることができます。
だんかい
さて、tryブロックに戻って、ファイル出力ルーチンを作成したら、次のコードをファイルに書き込んでみてください:
String fileContent = "my data file content"; fileOut.write(fileContent.getBytes()); 
データファイルに必要な内容をすべて書き込んだら、次のコードをクロージャーとして使用します:
fileOut.close(); 
第三段階
社内文書からコンテンツを取り出す必要がある場合、次のようなプロセスで取り出すことができます:
try{    
 FileInputStream fileIn = openFileInput("my_file");     
//read the file } catch(IOException ioe){     
Log.e("APP_TAG", "IO Exception", ioe); } 
トライ・ブロックでは、バッファ・リーダーを使ってファイルの内容が読み込まれます:
InputStreamReader streamIn = new InputStreamReader(fileIn); 
BufferedReader fileRead = new BufferedReader(streamIn); 
StringBuilder fileBuild = new StringBuilder(""); 
String fileLine=fileRead.readLine(); while(fileLine!=null){    
 fileBuild.append(fileLine+"
");     
fileLine=fileRead.readLine(); } 
String fileText = fileBuild.toString(); streamIn.close(); 
これはJavaの標準的な入出力操作の一部です。whileループは、ファイルの各行に対して1回ずつ実行されます。それが終わると、"fileText "変数がファイルの内容を文字列として保存し、すぐに使えるようにします。
3.外部公開文書
***ステップ
ユーザーのデバイスがサポートしている限り、アプリケーションは外部ストレージにファイルを保存することもできます。外部ストレージには、SD カード、その他のポータブルメディア、またはユーザーが取り外すことはできないがシステムによって外部として認識されるメモリストレージ機構など、多くの種類があります。ファイルが外部ストレージに保存されている場合、その内容は完全に公開され、ユーザーや他のアプリケーションからのアクセスを防ぐ方法はありません。
外部ストレージにデータを保存しようとする場合、まず対応するストレージメカニズムが利用可能であることを確認することが重要です:
String extStorageState = Environment.getExternalStorageState(); 
この情報は文字列として返され、分析したり、Environment クラスの外部ストレージ・ステータス・フィールドと比較したりすることができます:
if(Environment.MEDIA_MOUNTED.equals(extStorageState)){     
//ok to go ahead and read/ write to external storage } 
else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)){    
 //can only read } else{     //cannot read or write } 
外部ストレージがデバイス上に存在するとしても、アプリケーションがそこに書き込めることを先験的に仮定すべきではありません。
だんかい
外部ストレージへの書き込みが可能であることを確認したら、次はファイルの保存先を指定するディレク トリを取得する必要があります。以下のアプリケーション設定の内容は、レベル8以上のAPIを指しています:
File myFile = new File(getExternalFilesDir(null), "MyFile.txt"); 
これにより、誰でもこのファイルへの書き込みと読み込みができるようになります。ただし、プロジェクトのマニフェスト・ファイルに以下のみを追加することを忘れないでください:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
開発するアプリケーションが複雑になってくると、保存したファイルを他のアプリケーションと共有したくなるかもしれません。この場合、イメージや音楽ファイルなど、パブリックディレクトリの様々な汎用エントリを使用することができます。
4.データベース
アプリケーションがより複雑な構造化データを含むようになると、共有環境設定や内部/外部ファイルではもはや十分でなくなり、データベースソリューションを検討する時期に来ているかもしれません。Androidは、開発者がアプリケーション内でSQLiteデータベースを作成し、アクセスすることをサポートしています。Androidは、開発者がアプリケーション内でSQLiteデータベースを作成し、アクセスすることをサポートしています。データベースのセットが作成されると、それは単に問題のアプリケーションのプライベートコンポーネントサービスとして機能します。
AndroidアプリケーションでSQLiteデータベースを使用するには様々な方法がありますが、SQLiteOpenHelperを継承したクラスを使用することをお勧めします。このクラスでは、データベースのプロパティを定義し、様々なクラス変数を作成する必要があります:
private static final String NOTE_TABLE_CREATE =     "CREATE TABLE Note (noteID INTEGER PRIMARY KEY AUTOINCREMENT, " +     "noteTxt TEXT);"; 
この例では、ID とテキストの 2 つのカラムを持つ非常にシンプルなテーブルを扱っています。SQLiteOpenHelperクラスでは、onCreateメソッドをオーバーライドして独自のデータベースを作成することができます。Activityクラスなどのアプリケーションの他の部分では、SQLiteOpenHelperを通してデータベースにアクセスし、WritableDatabaseメソッドを使って新しいレコードを挿入し、getReadableDatabaseメソッドを使って既存のレコードを照会し、その結果をアプリケーションのUIに表示することができます。そしてその結果をアプリケーション UI に表示します。
クエリの結果を反復処理する場合、アプリケーションは Cursor クラスを使用します。
5.インターネットデータ
多くのアプリケーションはインターネットのデータソースを利用しており、中には基本的に多数のウェブデータソースとのインターフェースのセットで構成されているものさえあります。ユーザーのデバイスのインターネット接続を使用して、ウェブからデータを保存したり取得したりすることができ、このメカニズムはネットワーク接続がアクティブである限り機能します。これを行うには、マニフェストファイルに「android.permission.INTERNET」パーミッションを追加する必要があります。
アプリケーションでインターネットからデータを取得したい場合、アプリケーションのメイン UI スレッドからこの *** プロセスを確実に切り離す必要があります。AsyncTaskを使用すると、バックグラウンドプロセスによってWebソースからデータを取得し、データのダウンロードが完了した後に結果をUIに書き込み、UIがそれ自身の機能を正常に実行できるようにすることができます。
Activityクラスに内部のAsyncTaskクラスを追加し、データを取得する必要があるときにそのActivityにAsyncTaskのインスタンスを作成することもできます。AsyncTaskにdoInBackgroundメソッドとonPostExecuteメソッドを導入することで、Activityが取得したデータを取得してUIに書き込むことができます。
ウェブデータのフェッチは、アプリケーション開発作業の中では中々難しい作業であり、Android 開発を十分に理解した後にのみ試みるべきです。しかし、このようなデータ取得メカニズムは、ユーザーのデバイスの接続リソースを効率的に利用できるため、多くのアプリケーションにとって理想的であることにすぐに気づくでしょう。JavaとAndroidの両方が、返された構造化データ(JSONフィードなど)を処理するためのツールを提供しています。
はんけつをくだす





