【AndroidでSQLiteを制する】SQLiteOpenHelperを使ってデータベースを作成する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

SQLiteOpenHelperはSQLiteデータベースを作成したり、開いたり等管理するためのヘルパークラスです。
SQLiteOpenHelperにはデータベースの状態によって呼ばれるメソッドが複数定義されています。
これらのメソッドはSQLiteOpenHelper#getReadableDatabase、SQLiteOpenHelper#getWritableDatabaseが呼ばれた後に呼ばれます。
メソッド名 説明 初回生成時 2回目以降 アップグレード ダウングレード
void onConfigure(SQLiteDatabase db) データベース接続の設定時に呼び出されます。この時、ログ先行書き込みや外部キーサポート等の機能を設定します。 1 1 1 1
abstract void onCreate(SQLiteDatabase db) 初回接続時にデータベースが存在しない場合に呼ばれます。 基本はこのメソッドの中でデータベース内のテーブルを作成します。 2
abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 現在存在するデータベースのバージョンとコンストラクタで渡されたバージョンを比較し、 コンストラクタで渡されたバージョンが大きい場合に呼ばれます。 このメソッドの中でバージョンアップに伴うスキーマの変更を行います。 2
void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) 現在存在するデータベースのバージョンとコンストラクタで渡されたバージョンを比較し、 データベースのバージョンが大きい場合に呼ばれます。 このメソッドの中でバージョンダウンに伴うスキーマの変更を行います。 2
void onOpen(SQLiteDatabase db) データベースファイルからアクセス可能になった時に呼ばれます。 3 2 3 3

SQLiteOpenHelperの使ってデータベースとテーブルを作成する

AndroidでSQLiteを使用する場合は、SQLiteOpenHelperを継承したクラスを作成します。
前回作ったスキーマクラスをSQLiteOpenHelperを継承したクラス内で使用します。
    /**
     * SQLiteOpenHelperを継承してデータベースを管理するクラスを実装する
     */
    public class LoadToSQLiteMasterSQLiteOpenHelper extends SQLiteOpenHelper {

        /**
         * SQLiteOpenHelperはデータベースを作成したり、開いたりするためのヘルパークラスです。
         * @param context
         */
        public LoadToSQLiteMasterSQLiteOpenHelper(Context context) {
            /**
             * Context context : コンテキスト
             * String name : データベースファイル名を指定します、nullを渡した場合はメモリ上にデータベースが作成されます。
             * SQLiteDatabase.CursorFactory factory : Cursorオブジェクトを作成するファクトリークラスを指定します、nullを指定するとデフォルトのものが使用されます。
             * int version : データベースのバージョンを指定します、作成済みのデータベースがある場合は「作成済みバージョン」と「引数バージョン」が比較されます。
             *               作成済みバージョン = 引数バージョン : インスタンスが作成されます。
             *               作成済みバージョン < 引数バージョン : SQLiteOpenHelper#onUpgradeが呼ばれます。
             *               作成済みバージョン > 引数バージョン : SQLiteOpenHelper#onDowngradeが呼ばれます。
             * DatabaseErrorHandler errorHandler : データベースになんらかの破損を検知した時に呼ばれるコールバックインターフェースを設定する。
             */
            super(context, LoadToSQLiteMasterContract.DataBase.DATABASE_NAME, null, LoadToSQLiteMasterContract.DataBase.DATABASE_VERSION,null);
            Log.d(TAG, "LoadToSQLiteMasterSQLiteOpenHelper: ");
        }

        @Override
        public void onConfigure(SQLiteDatabase db) {
            Log.d(TAG, "onConfigure: ");
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            Log.d(TAG, "onCreate: ");
            // Bookテーブルを作成します。
            db.execSQL(LoadToSQLiteMasterContract.Book.SQL_CREATE_ENTRIES);
        }

        @Override
        public void onOpen(SQLiteDatabase db) {
            Log.d(TAG, "onOpen: ");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.d(TAG, "onUpgrade: ");
            // Bookテーブルを削除します。
            db.execSQL(LoadToSQLiteMasterContract.Book.SQL_DROP_ENTRIES);
            onCreate(db);
        }

        @Override
        public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.d(TAG, "onDowngrade: ");
        }
    }

SQLiteOpenHelperを使用する

データベースにアクセスは下記の手順を踏む必要があります。
  1. SQLiteOpenHelperを継承したクラスをインスタンス化する。
  2. SQLiteOpenHelper#getReadableDatabaseまたはSQLiteOpenHelper#getWritableDatabaseを使用し、 SQLiteDatabaseクラスのインスタンスを取得します。
  3. SQLiteDatabaseインスタンスのメソッドを使用することでテーブルにアクセスする。
  4. SQLiteOpenHelper#closeを使用してデータベースを閉じる。
    // SQLiteOpenHelperをインスタンス化する
    LoadToSQLiteMasterSQLiteOpenHelper loadToSQLiteMasterSQLiteOpenHelper = new LoadToSQLiteMasterSQLiteOpenHelper(context);
    // データベース名を取得します
    Log.d(TAG, "データベース名 : " + loadToSQLiteMasterSQLiteOpenHelper.getDatabaseName());
    // 読み取り専用のデータベースを取得する
    SQLiteDatabase readableDatabase = loadToSQLiteMasterSQLiteOpenHelper.getReadableDatabase();
    // 読み書き可能なデータベースを取得する
    SQLiteDatabase writableDatabase = loadToSQLiteMasterSQLiteOpenHelper.getWritableDatabase();

SQLiteOpenHelperのログ先行書き込み機能(Write-Ahead Logging)を使用する

ログ先行書き込み機能を有効にすると、データベースへの書き込み方法が変わります。
トランザクション開始から終了までの更新内容を-shmファイルに書き込まれます。
トランザクションが終了しコミットした時点で-walファイルへ更新内容を書き込まれます。
SQLiteOpenHelper#closeでデータベースが解放されたタイミングで-walファイルからデータベース本体に書き込まれます。
この機能はデフォルトでは無効になっています、SQLiteOpenHelper#setWriteAheadLoggingEnabledで変更されます。
しかし、読み取り専用で開かれたデータベースではこの設定は無効化されます。
詳細についてトランザクションを使用について説明する投稿で説明する予定です。