前回から、Androidおよびリレーショナルデータベース管理システムのSQLiteを用いて、実際にデータベースを活用したアプリケーションを作成しています。前回はCurryDbHelperクラスを使ってインスタンスを作成しました。今回はその続きからはじめて、アプリケーションを完成させましょう。

データベースのテーブルを作る

 CurryDbHelperクラスが入ったCurryDbHelper.javaがリスト5(クリックでリストを表示、以下同)です。Androidでは、android.database.sqlite.SQLiteOpenHelperというヘルパークラスを継承したクラスからSQLiteのデータベースを操作します。そのクラスを使って、SQLiteデータベースの作成、テーブル作成、データベースのスキーマのバージョン管理といった作業を行います。その子クラスとしてCurryDbHelperを作ります。

 SQLiteOpenHelperは抽象クラスなので、必ず定義しなければいけないメソッドがあります。(1)のコンストラクタ、(2)のonCreateメソッド、(7)のonUpgradeメソッドです。

 (1)のコンストラクタでは、AndroidのContextクラスを使っています。Contextクラスには、実行中のアプリケーションとその周りの環境についての情報が入っています。SQLiteOpenHelperクラスから派生させたクラスでは、親クラスのコンストラクタにContextと作成したいデータベースの名前とスキーマのバージョン番号を渡すだけで、Android SDKがアプリケーション固有の領域にデータベースを作成してくれます。

 (2)のonCreateメソッドは、初めてデータベースを作成する際に呼び出されるもので、通常はテーブルを作成します。

表1●今回作るテーブル
SHOPテーブル(店舗マスター)
表1●今回作るテーブル-SHOPテーブル(店舗マスター)
MEMOテーブル(メモテーブル)
表1●今回作るテーブル-MEMOテーブル(メモテーブル)

 今回、データベースに表1のテーブルを作ります。AndroidのSQLiteを使う場合は、「_id」という主キーを用意することが推奨されています。_idという名前の主キーを用意することでコードを簡潔に記述できるのです。

 SHOPテーブルの_id列は店舗のID番号で、MEMOテーブルのSHOP_ID列で結合させて、SHOPに対するMEMOの一覧を得ることができるようにします。(3)でSHOPテーブル、(4)でMEMOテーブルを作ります。

 (5)で(8)を、(6)で(9)を呼び出します。ShopDaoクラスのinsertメソッドを使ってSHOPテーブルとMEMOテーブルに3件ずつデータを入れます。insertの前には、SqLiteDatabaseのbiginTransactionメソッドでトランザクションを開始し、setTansactionSuccessfulでデータベースの変更をコミットし、endTransactionでトランザクションを終了します。トランザクション制御しなくても、自動で1件ずつコミットが発生します。本文の例では、3件のデータしか格納しませんが、100件単位のような大量のデータを投入する場合は、1件単位でコミットすると性能が劣化します。そこで、まとめてコミットしました。次はShopDaoクラスを説明します。