SQLiteOpenHelperクラスとSQLiteDatabaseクラス 【Android TIPS】
AndroidではSQLite(エスキューライト)をサポートしています。
SQLiteはMySQLやOracleのようなデータベース管理システムです。
一般的なデータベース管理システムのようにクライアントサーバー型ではなくライブラリの形で利用できる軽量のデータベースで、データは全て1つのファイルに保存されています。
大量のデータの扱いには不向きですが、全プログラムを合わせても600kb前後と少なく、アプリケーションローカルで使用するデータベースエンジンとしては非常に合理的に作られています。
また標準で搭載しているデータ型が整数型(INTEGER)、浮動小数型(REAL)、文字列型(TEXT)、無制限スカラ型(BLOB)の4種類(日付時刻型がありません!)しかないことも特徴です。
作成したデータベースファイルは以下のディレクトリに保存されています。
/data/data/パッケージ名/databases/
SQLiteはJDBCドライバを用いたアクセスをサポートしているため、SQL(Structured Query Language)を直接実行することも可能ですが、Androidでは、SQLiteOpenHelperクラスとSQLiteDatabaseクラスを用いることが推奨されています。
これらのクラスを用いることで、データベースファイルの管理やデータベーススキーマのバージョン管理を簡単に行うことができます。
SQLiteDatabaseクラスはデータベースを操作するために使用するクラスです。
SQLiteDatabaseオブジェクトは、通常SQLiteOpenHelperクラスを継承したクラスを経由して取得します。
以下のサンプルはSQLiteOpenHelperを継承したMyOpenHelperクラスの例です。
public class MyOpenHelper extends SQLiteOpenHelper { private static final int DB_VERSION = 1; private static final String DB_NAME = "myapp.db"; // テーブル作成SQL private static final String CREATE_TABLE_MESSAGES = "" + "CREATE TABLE messages (" + " _id INTEGER PRIMARY KEY," + " addrfrom TEXT," + " addrto TEXT," + " title TEXT," + " body TEXT" + ")"; public MyOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // テーブル作成 db.execSQL(CREATE_TABLE_MESSAGES); // サンプルデータ投入 db.execSQL("INSERT INTO messages(addrfrom, addrto, title, body) " + "VALUES('piyopiyo@sakc.jp', 'hogehoge@sakc.jp', 'こんにちわ', 'Hello World!!')"); db.execSQL("INSERT INTO messages(addrfrom, addrto, title, body) " + "VALUES('piyopiyo@sakc.jp', 'hogehoge@sakc.jp', 'こんばんわ', 'Nice to meet you!!')"); db.execSQL("INSERT INTO messages(addrfrom, addrto, title, body) " + "VALUES('hogehoge@sakc.jp', 'piyopiyo@sakc.jp', 'RE:こんばんわ', 'Nice meeting you!')"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // データベーススキーマに変更が生じた場合は、ここに処理を記述する。 } }
SQLiteOpenHelperクラスは抽象クラスのため、onCreate()とonUpgrade()をオーバーライドする必要があります。
また、Contextクラスを引数にもつコンストラクタも作成します。
コンストラクタ(17~19行目)
スーパークラスのコンストラクタを呼び出しています。
SQLiteOpenHelperクラスのコンストラクタには引数が4つ定義されており、それぞれ下記のような意味を持ちます。
1. データベースを所有するContextオブジェクトを指定する
2. データベースファイル名(nullを指定した場合は、データベースはメモリ上に作成される)
3. Cursorオブジェクトを作成するために使われるFactoryオブジェクトを指定する(通常はnullでよい)
4. データベースのバージョンを指定する
データベースのバージョンはデータベーススキーマの変更に対して付与するバージョンのことです。
onCreateメソッド(21~30行目)
データベースが存在していない場合に呼ばれるメソッドです。
一般的には、テーブルの作成と初期データの投入を行うようです。
onUpgradeメソッド(32~35行目)
データベースが既に存在し、データベースのバージョンがコンストラクタで指定したバージョンと異なる場合に呼ばれるメソッドです。
アプリケーションのバージョンアップ等で、データベーススキーマの変更やデータパッチが必要となった場合に、このメソッド内に処理を記述します。
SQLのALTER TABLE文やUPDATE文などが該当します。
注意しなくてはならない点は、データベースを利用したアプリを作る際のデバッグについてです。
最初に、アプリケーションをEclipseから実行すると、onCreate()メソッドの処理が行われデータベースの作成およびテーブル作成、サンプルデータの投入が行われます。
この後にテーブル定義のミス等で「CREATE TABLE」文を修正したとしましょう。
修正後に、再度アプリケーションを実行しても、テーブル定義が反映せずどこに問題があるのかわからなくなることがあります。
これは、2回目のプログラム実行時に既にデータベースが作成済みのため、onCreate()メソッドは実行されないことが原因です。
初めてデータベースを用いたアプリを作る際に、陥りやすいミスですので注意しておきたいところです。
テーブルを再作成したい等で再度onCreate()メソッドを実行したい場合は、アプリケーションをアンインストールした後にEclipseから実行しましょう。
次に、冒頭で紹介したSQLiteDatabaseオブジェクトの取得方法です。
ActivityのonCreate()メソッド内などで取得する場合のサンプルプログラムです。
MyOpenHelper helper = new MyOpenHelper(this); SQLiteDatabase db = helper.getWritableDatabase();
SQLiteOpenHelperクラスをインスタンス化し、データベースへの書き込みを行う場合はgetWritableDatabase()を、データベースからの読み込みを行う場合はgetReadableDatabase()を実行し、SQLiteDatabaseオブジェクトを取得します。
データベースへの操作はこのSQLiteDatabaseオブジェクトを経由して行うことになります。
上のサンプルの「テーブル作成」や「サンプルデータ投入」(22~29行目)のように行います。