Android SDK スタート ガイド||第 10 章 アプリケーション データ

第10章 アプリケーションデータ

私たちは、リソース、マニフェスト、ユーザー インターフェイスなど、Android アプリケーションの構造と基本要素についてはすでに理解しています。Android プラットフォームで機能的なアプリケーションの開発に着手した後は、誰もが必ず何らかの種類のデータを保存する必要があります。Android プラットフォームには、アプリケーションのデータ ストレージ タスクを処理するためのさまざまなオプションが用意されており、これが今日の記事で説明する内容です。

大まかに言うと、Android アプリには主に 5 種類のデータ ストレージ オプションがあります。アプリの共有設定でのデータの保存、内部ストレージ (アプリ自体のプライベート) へのデータの保存、(デバイスに公開) の外部ストレージへのデータの保存です。データベースに保存され、デバイスのインターネット接続を通じてアクセスできる Web リソースに保存されます。スペースの制限があるため、これらのオプションについて詳しく説明することはできませんが、永続データを使用する必要がある場合のストレージの問題の解決策を明確にするために、各ソリューションの基本的な特徴を要約します。

1. 共有設定

最初の一歩

共有設定を使用すると、誰もが基本的なデータ型をキーと値のペアの形式で保存できます。アプリケーションの共有設定ファイルは、最も単純なデータ ストレージ オプションとみなされますが、その性質上、保存できる内容にいくつかの制限が課されます。これを使用して、基本的なタイプの数値 (整数、long 数値、浮動小数点数など)、ブール値、およびテキスト文字列を保存できます。アプリケーションの実行中に取得できるように、保存する各値に名前を割り当てる必要があります。最初に作成するアプリでは共有設定を使用する可能性が高いため、必要な知識を定着させるのに役立つように、それらに焦点を当て、他のオプションよりも詳細に説明します。

このコードをメインのアクティビティ クラスで試し、後でこのチュートリアル シリーズのアプリケーション例を実行するときにテストできます。理想的には、共有設定は、外観設定の選択と同様に、アプリケーションのユーザー構成オプションと一致している必要があります。ユーザーがクリックした後に画面に「Ouch」というテキストを表示する単純なボタンをかつて作成したことをまだ覚えているかもしれません。ここで、ユーザーがボタンを 1 回クリックした後もボタン上に「痛い」という単語が継続的に表示され、アプリケーションの実行中はこの状態が変わらないと仮定します。これは、ボタン上の最初のテキストは、ユーザーが初めてアクションをクリックするまでのみ存在することを意味します。

共有設定をアプリケーションに追加しましょう。クラスの先頭、onCreate メソッドの前に、共有設定の名前を選択します。

public static final String MY_APP_PREFS = "MyAppPrefs"

「public static」修飾子を使用すると、アプリケーション内の任意のクラスでこの変数にアクセスできるため、ここで設定名の文字列を保存するだけで済みます。変数は定数であるため、大文字を使用します。これが、「final」修飾子が存在する理由です。アプリケーション設定でデータエントリを取得または設定するときは、全員が同じ名前を使用する必要があります。

ステップ2

次に、共有設定のコンテンツを作成しましょう。onClick メソッドで、ボタン「Ouch」テキスト設定の下で、この共有設定を名前で取得してみます。

SharedPreferences thePrefs = getSharedPreferences(MY_APP_PREFS, 0);

「android.conent.SharedPreferences」クラスのインポートを追加する必要があります。「SharedPreferences」テキストの上にマウスを置き、Eclipse プロンプトを使用してインポートを完了します。最初のパラメータは定義した設定の名前で、2 番目のパラメータはデフォルト オプションとして使用する基本モードです。

ここで、共有設定のエディターを指定して値を設定する必要があります。

SharedPreferences.Editor prefsEd = thePrefs.edit();

これで、共有設定に値を書き込むことができます。

prefsEd.putBoolean("btnPressed", true);

現在の状態はユーザーがボタンを押したかどうかの 2 つだけであるため、ここではブール型を使用します。エディターには、この共有設定のセットを保存するために選択できるいくつかの異なるタイプが用意されており、それぞれに独自の名前と値のパラメーターがあります。最後に、編集結果を送信する必要があります。

prefsEd.commit();

第三段階

次に、保存された値を使用して、ユーザーがアプリケーションを実行するときにボタンに表示される内容を検出してみましょう。onCreate の既存のコードの後に​​共有設定を追加します。

SharedPreferences thePrefs = getSharedPreferences(MY_APP_PREFS, 0);

今回は値を取得するだけなのでエディタを使用する必要はありません。

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」クラスをインポートして追加する必要があります。ファイル名とモードが提供されます。プライベート モードを選択すると、ファイルはアプリケーションによってのみ使用されます。ここでコードのこの部分 (onClick メソッドなど) をアクティビティに追加すると、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.util.Log' をインポート)。これにより、コードの実行時に発生する特定の条件が記録されます。文字列ラベルのクラス変数を定義できます。これは、上記のコードの最初のパラメータです。このようにして、エラーが発生すると、誰でも Android LogCat で例外情報を確認できます。

ステップ2

ここで 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);
}

try ブロックで、バッファー付きリーダーを使用してファイルの内容を読み取ります。

InputStreamReader streamIn = new InputStreamReader(fileIn);
BufferedReader fileRead = new BufferedReader(streamIn);
StringBuilder fileBuild = new StringBuilder("");
String fileLine=fileRead.readLine();
while(fileLine!=null){
    fileBuild.append(fileLine+"\n");
    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
}

外部ストレージがデバイス上に存在する場合でも、アプリがそこにデータを書き込むことができると想定することはできません。

ステップ2

実際に外部ストレージにデータを書き込むことができることを確認したら、次にディレクトリを検索してファイルの保存場所を指定する必要があります。次のアプリケーション設定は、API レベル 8 以降を指します。

File myFile = new File(getExternalFilesDir(null), "MyFile.txt");

このようにして、誰もがファイルの書き込みと読み取りを行うことができます。ただし、プロジェクトのマニフェスト ファイルに次の制限を追加することを忘れないでください。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

私たちが開発するアプリケーションはより複雑になるため、保存したファイルを他のアプリケーションと共有することが必要になる場合があります。この場合、写真や音楽ファイルなど、パブリック ディレクトリ内の共通エントリを使用できます。

4. データベース

アプリケーションに含まれる構造化データがますます複雑になるにつれ、共有設定や内部/外部ファイルでは実際のニーズを満たすことができなくなる可能性があるため、現時点ではデータベース ソリューションの使用を検討する必要があります。Android を使用すると、開発者はアプリケーション内で SQLite データベースを作成し、アクセスできます。データベースを作成すると、データベースは関連するアプリケーションのプライベート コンポーネント サービスとしてのみ機能します。

Android アプリケーションで SQLite データベースを使用するにはさまざまな方法がありますが、この要件を達成するには SQLiteOpenHelper を拡張するクラスを使用することをお勧めします。このクラスでは、データベース プロパティを定義し、さまざまなクラス変数 (定義したデータベース リスト名とその SQL 作成文字列を含む) を作成する必要があります。具体的なコードは次のとおりです。

private static final String NOTE_TABLE_CREATE = 
    "CREATE TABLE Note (noteID INTEGER PRIMARY KEY AUTOINCREMENT, " +
    "noteTxt TEXT);";

ここで示す例には、非常に単純なテーブル セットのみが含まれており、このテーブルには 2 つの列が含まれており、1 つの列には ID が含まれ、もう 1 つの列にはテキストが含まれており、両方の列はユーザ​​ーの注釈情報を記録するために使用されます。SQLiteOpenHelper クラスでは、onCreate メソッドをオーバーライドして独自のデータベースを作成できます。Activity クラスなどのアプリケーションの他の部分では、SQLiteOpenHelper を介してデータベースにアクセスし、WritableDatabase メソッドを使用して新しいレコードを挿入し、getReadableDatabase メソッドを使用して既存のレコードをクエリし、結果をアプリケーション UI に表示できます。

クエリ結果を反復処理する場合、アプリケーションは Cursor クラスを使用し、結果セット内の各行を順番に参照します。

5. インターネットデータ

多くのアプリケーションはインターネット データ リソースを使用しており、一部のアプリケーションは基本的に一連のインターフェイスと多数の Web データ ソースで構成されています。ユーザーのデバイスのインターネット接続を使用して、Web にデータを保存したり、Web からデータを取得したりできます。このメカニズムは、インターネット接続が有効である限り、正常に機能します。これを実現するには、マニフェスト ファイルに「android.permission.INTERNET」権限を追加する必要があります。

アプリケーションにインターネットからデータを取得させたい場合は、このプロセスがアプリケーションのメイン UI スレッドから分離されていることを確認する必要があります。AsyncTask を使用すると、バックグラウンド プロセスを通じて Web ソースからデータを取得し、データのダウンロードが完了した後に結果を UI に書き込み、最終的に UI にその機能を通常どおり実行させることができます。

データを取得する必要がある場合は、内部 AsyncTask クラスをアクティビティ クラスに追加し、アクティビティ内に AsyncTask インスタンスを作成することもできます。AsyncTask に doInBackground メソッドと onPostExecute メソッドを導入すると、Activity で取得したデータを取得してユーザー インターフェイスに書き込むことができます。

アプリ開発業務においてWebデータの取得はそれなりに難しい作業なので、Android開発の知識を習得してから挑戦すると良いでしょう。ただし、このようなデータ取得メカニズムは、ユーザー デバイスの接続リソースを効果的に利用できるため、多くのアプリケーションに非常に適していることがすぐにわかるでしょう。Java と Android はどちらも、JSON フィードなど、返された構造化データを処理するための関連ツールを提供します。

結論は

今日の記事では、Android アプリケーションを開発する際に使用する必要があるデータ ストレージ ソリューションについて基本的に理解しました。最終的にどのソリューションを選択する場合でも、さまざまなソリューションは特定のニーズにのみ適しているため、実際のニーズを参照基準として使用する必要があります。この一連のチュートリアルの次のパートでは、インストールされている Eclipse インストールに物理デバイスを接続する方法と、仮想デバイスを作成する方法を学びます。この後、両方のタイプのデバイスでアプリケーションを実行する方法についても説明します。さて、あと 2 回の記事でこの一連のチュートリアルは完全に終了することをご報告したいと思います。最後の記事では、アプリケーション開発の準備に役立つ一般的なクラスと Android アクティビティのライフ サイクルについて学習します。 。

おすすめ

転載: blog.csdn.net/m0_69824302/article/details/132698882