Androidプログラミング-SQLite¶
SQLiteの利用方法¶
データベースのオープン、テーブルの作成・破棄などは、android.database.sqlite.SQLiteOpenHelper
を継承したアプリケーション独自のデータベースヘルパークラスを作成し、その中に記述することが常套手段のようです。
SQLiteOpenHelperからSQLiteDatabaseインスタンスを取得し、データベースアクセスの処理(いわゆるCRUD)を実行します。
データベースアクセスのエラー処理¶
SQLiteDatabaseクラスのexecSQLメソッドや、SQLiteStatementの各メソッドを実行してデータベースにアクセスする際は、実行時例外(非チェック例外)のandroid.database.sqlite.SQLExceptionかそのサブタイプがスローされる可能性があります。
非チェック例外なので例外処理を記述しなくてもコンパイルは通るので、基本はtry-catchで例外を拾ってエラー処理を記述します。
データベースのクローズ要否¶
SQLiteHelperインスタンスがgetReadableDatabaseメソッドあるいはgetWritableDatabaseメソッドで返却するデータベースインスタンスはそれぞれ同じものです。そのため、利用側で取得したSQLiteDatabaseインスタンスをcloseしてしまうと、次のgetReadableDatabaseあるいはgetWritableDatabaseで取得したSQLiteDatabaseインスタンスはクローズされているものとなってしまい、不都合です。
実装メモ¶
データベースヘルパークラス実装方法¶
- コンストラクタを1つ定義する
SQLiteOpenHelperは、引数なしのコンストラクタが定義されていないので、明示的にコンストラクタを定義します。ここでデータベースファイル名とバージョン番号を指定します。 - onCreateメソッドをオーバーライドする
テーブルの作成、初期データのインサートを記述します。 - onUpgradeメソッドをオーバーライドする
データベースのバージョンアップ時の処理(マイグレーション)を記述します。
データベースヘルパークラスの実装例¶
public class MySqliteHelper extends SQLiteOpenHelper {
public MySqliteHelper(Context context) {
// データベースファイル名、バージョン番号を指定
super(context, "my.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase database) {
// テーブルの作成
try {
database.execSQL(
"CREATE TABLE IF NOT EXISTS mine(id integer primary key autoincrement"
+ ", title text not null, memo text not null)"
);
} catch (SQLException ex) {
Log.e(TAG, "SQLite execution failed: " + ex.getLocalizedMessage());
}
}
@Override
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
// バージョン更新時は既存テーブルを破棄して再初期化
try {
database.execSQL("DROP TABLE IF EXISTS mine");
onCreate(database);
} catch (SQLException ex) {
Log.e(TAG, "SQLite execution failed: " + ex.getLocalizedMessage());
}
}
}