Home > Android > Android特集 第15回 Androidによる並行処理 データベース接続処理編

KENスクールはITエンジニア・Web/DTP・オフィスPCの専門パソコンスクール

Android特集 第15回 Androidによる並行処理 データベース接続処理編

  • Posted by: kenschool
  • 2011年2月22日 12:24
  • Android

第14回Androidによる並行処理では、

Androidアプリでの並行処理のポイントと実現方法

Handlerクラスを挙げて紹介しました。
 

今回は、その回で作成したアプリの機能のうち、

SQLiteを使用したデータベース登録機能及び抽出機能

について解説していきます。
 

サンプルは第14回から入手可能です。


訂正とお詫び
第14回の連載の終わりに、次回の連載ではネットワーク通信処理を紹介すると
お伝えしましたが、別な連載時に変更させていただきます。

 
Androidには標準でSQLiteデータベースソフトウェアが組み込まれています。
 

SQLiteは一般的なデータベースソフトウェアのようにインストールを必要とせず、

1つのデータベースを1つのファイルで管理する特徴を持っています。


その軽量性からスマートフォンやその他小型端末で利用されているのです。


SQLiteデータベースを使用するために、

Android SDKにはSQLiteOpenHelperクラスと

SQLiteDatabaseクラスが用意されています。
 

これらのクラスの役割と、どのように利用するのかを見ていきましょう。


・SQLiteOpenHelperクラス

このクラスの役割をGoogleは、

A helper class to manage database creation and version management.

と定義しています。


データベースの作成と作成したデータベースのバージョン(更新管理)を管理する

Helperクラスなんですね。


開発者はこのクラスを継承して独自のクラスを作成する必要があります。
 

その際コンストラクタと抽象メソッドである、onCreateメソッドと

onUpgradeメソッドを定義しなければなりません。


サンプルの例を見てみましょう。


コンストラクタ
public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}


親クラスであるSQLiteOpenHelperクラスのコンストラクタを呼び出しています。
 

このようにすることで、独自に作成するHelperクラス(DatabaseHelperクラス)に

基本機能を持たせることができる、と押さえておけば良いと思います。
 

この親クラスのコンストラクタの引数は何でしょうか。


Googleの定義より

Create a helper object to create, open, and/or manage a database.

public SQLiteOpenHelper (Context context, String name, 

SQLiteDatabase.CursorFactory factory, int version)


第一引数のContextとは直訳すると「文脈、背景、情景」ですが、

Googleの言うところでは、

Interface to global information about an application environment.

This is an abstract class whose implementation is provided by the Android system.

 It allows access to application-specific resources and classes,

as well as up-calls for application-level operations such as launching activities,

broadcasting and receiving intents, etc.


掻い摘んで言うと、Androidアプリケーション全体の環境情報に関する

インターフェースで、ある特定のリソースにアクセスする操作を提供するようです。
 

データベースも特定のリソースに含まれるようですね。


ActivityクラスはContextクラスのサブクラスなので、

独自クラスのDatabaseHelperのコンストラクタの引数に渡す事ができます。


サンプルのDBActivityクラスより、

protected void onCreate(Bundle savedInstanceState){
    ・・・
    helper = new DatabaseHelper(this);
    ・・・
}

第二引数は、作成または使用するデータベース名、

第三引数はカーソルオブジェクトです。
 

カーソルオブジェクトとはデータベース内の表の

レコード管理をするオブジェクトです。
 

独自の定義を使用する際に使用するのですが、

特に用いない場合には「null」と指定します。


第四引数はデータベースのバージョンを整数で指定しますが、

「1」から始める必要があるようです。


データベースを作り直す際に、例えば、

これまでのデータベースをバージョン「0」、

新規データベースをバージョン「1」とする、のように整数を指定します。
 

これらの情報はフィールドに定義しておいたほうが管理しやすいでしょう。


サンプルアプリのDatabaseHelperクラスのフィールド

private static final String DATABASE_NAME = "kendb.db";
public static final String TABLE_NAME_KEN_TABLE = "ken_table";
private static final int DATABASE_VERSION = 1;


次に2つのメソッドの定義を見ていきます。


onCreateメソッドはデータベースが最初に作成された時に1度呼び出され、

その際にテーブルの作成などを行います。


Googleの定義より、

Called when the database is created for the first time.


サンプルのDatabaseHelperクラスでは次のように定義しました。
 

SQLiteDatabaseオブジェクトのexecSQLメソッドは

引数で受け取ったSQLを実行します。
 

このメソッドは内部で自動的に呼び出されます。

 @Override
 public void onCreate(SQLiteDatabase db) {
  db.execSQL(create_table);

 }
 

サンプルではテーブル作成用のSQLはDatabaseHelperクラスの

フィールドに定義してあります。


private final String create_table = "CREATE TABLE IF NOT EXISTS "+
    TABLE_NAME_KEN_TABLE + "(" +
    "user_id integer primary key autoincrement," +
    "nickname text," +
    "comment text)";


続いてonUpgradeメソッドですが、このメソッドは

データベース更新時にデータベースを新規作成し、

更新する時に自動的に呼び出されます。
 

そのため処理内容としては

テーブルの削除、追加作成、新規作成、その他の処理を行います。
 

Googleの定義より、
Called when the database needs to be upgraded.

The implementation should use this method to drop tables, add tables,

or do anything else it needs to upgrade to the new schema version.

 
サンプルのDatabaseHelperクラスでは次のように定義しました。
 

「ken_table」が存在していた場合それを削除しテーブルを再作成しています。

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  db.execSQL("DROP TABLE IF EXISTS ken_table");
  onCreate(db);
 }


このメソッドの第二引数と第三引数にはデータベースのバージョンを表す

整数値を指定します。


新しいバージョンは整数値の「1」以上を指定しなければならないため、

今回のサンプルでは第二引数の値には「0」を、

第三引数には「1」を指定しています。


DBActivityクラスより、

btn3.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        helper.onUpgrade(helper.getWritableDatabase(), 0, 1);
    }
});


ボタンクリック時にonUpgradeメソッドを実行しています。


第一引数には書き込みモードを

指定したデータベースオブジェクトに入れています。
 

データベースオブジェクトは読み取りモードと書き込みモードを指定して

作成することができ、データベースに対して

表の作成やデータの挿入を行う際には書き込みモードを指定します。


最後にデータの挿入を見てみましょう。


DBActivityクラスより抜粋

SQLiteDatabase db = helper.getWritableDatabase();
    ContentValues inputData = new ContentValues();
    inputData.put("nickname", name);
    inputData.put("comment", cm);
    db.insert("ken_table", null, inputData);
    db.close();


挿入するデータはContentValuesオブジェクトのputメソッドを呼び出し、

第一引数に列名、第二引数に挿入するデータを指定します。


そしてデータベースオブジェクトのinsertメソッドを呼び出し、

第一引数にはテーブル名、第二引数は挿入対象ではない列に対する初期値、

第三引数にContenValuesオブジェクトを指定します。
 

この第二引数に関してですが、挿入データを含む新規の行は、

完全に何らかの値を有していないといけないようです。


つまり、ContentValuesオブジェクトに指定しなかった列に対しては

データが挿入されないわけですから、その場合明示的に

「null」の初期値を与えなければならないようです。


Googleの定義より、
SQL doesn't allow inserting a completely empty row,

so if initialValues is empty this column will explicitly be assigned a NULL value


いかがだったでしょうか。


今回はSQLiteデータベースの基本仕様を説明しました。
 

AndroidアプリではSQLiteは重宝されていますので、

必ず押さえておいてくださいね。

--------------------------------------------------------------------------------

パソコンスクール KENスクール北千住校 Programインストラクター
http://www.kenschool.jp/school/kitasenju/index.html

KENスクールでAndroidアプリを開発したい方は、Program講座へ!
http://www.kenschool.jp/Program/index.html

トラックバック:0

TrackBack URL for this entry
http://it.kenblog.net/mt-tb.cgi/1161
Listed below are links to weblogs that reference
Android特集 第15回 Androidによる並行処理 データベース接続処理編 from KEN IT BLOG - ITエンジニア/SEを育成するパソコンスクールKENのインストラクターがつづるブログ

Home > Android > Android特集 第15回 Androidによる並行処理 データベース接続処理編

Search
Feeds

ページトップへ