トランザクション処理2016年12月11日(編集2016年12月11日)TweetAndroidアプリ開発では、データベースにSQLiteが利用できます。この記事は、AndroidアプリのSQLiteでトランザクション処理を実装する方法を記載した記事です。初心者向けサンプルコードAndroid-SQLite-Demoトランザクショントランザクションは、SQL処理で分割することのできない、一連の情報処理の単位のことです。トランザクションを使うのは、途中で処理が中断した場合、データが中途半端な状態で登録されるのを防ぐためです。insert2がまとまった処理です。update1やinsert2でエラーが発生し、処理に失敗してしまうと、データが不整合となります。この場合、insert1、update1、insert2が、ひとまとめの処理として実行されなければいけません。いった場合に、一連の処理をトランザクションにして対応します。SQLiteAndroidのSQLiteは、トランザクションを利用できます。例として、上記の図1のトランザクションを実装してみましょう。実装AndroidでSQLiteを使う場合は、SQLiteDatabaseクラスを使います。SQLiteDatabaseクラスは、直接操作するより、Helperクラスを用意した方が使いやすくなります。}}上記は、AndroidでSQLiteを操作するための基本的な処理を記述したhelperクラスです。lockが発生するような処理をする場合は、Singletonを使いましょう。ここでは、上記のシンプルなHelperクラスを使います。トランザクションの開始トランザクションの開始を実装します。トランザクションの開始は、全ての処理の前に行う必要があります。図2図2の赤線の部分をコードで記述します。this.db.beginTransaction();db変数は、SQLiteDatabaseクラスです。SQLiteDatabase#beginTransactionメソッドを呼ぶことで、トランザクションが開始されます。ヘルパークラスでは以下のように記載します。}}トランザクション終了トランザクションの終了を実装します。図3図3の赤線の部分をコードで記述します。this.db.endTransaction();endTransactionメソッドを呼ぶと、beginTransactionメソッドで開始したトランザクションが終了します。beginTransactionメソッドを使ったら、endTransactionは必ず呼び出す必要があります。try-finally文で使います。トランザクション後に成功処理を呼び出さないでendTransactionを呼び出した場合、トランザクション間の処理は保存されません。ロールバック処理になります。ヘルパークラスでは以下のように記載します。全ての処理が正常終了した後、トランザクションに成功通知をする必要があります。図4図4の赤線の部分をコードで記述します。this.db.setTransactionSuccessful();setTransactionSuccessfulメソッドを実行すると、beginTransactionメソッドで開始した処理が成功したというマークが記録されます。beginTransactionメソッドで開始したトランザクションは、setTransactionSuccessfulメソッドか、endTransactionメソッドを呼び出すまでDatabaseに対してなにも行いません。ヘルパークラスでは以下のように記載します。}}ロールバックAndroidのSQLiteにロールバック処理はありません。処理に失敗した場合は、beginTransactionメソッドの後にendTransactionメソッドを呼び出します。1の処理は反映されません。トランザクションは、setTransactionSuccessfulメソッドが呼び出されなければ、コミットされません。上記を踏まえると、以下のようなコードが記述できます。}上記のコードで、トランザクションを意識した処理を実行することができます。実装のポイント実装のポイントは、setTransactionSuccessfulメソッドとendTransactionの処理です。このどちらかのメソッドを呼び出すことで、beginTransactionメソッドで開始したトランザクションが終了します。逆に言うと、これらの処理を呼び出さないと、トランザクション状態が続きます。finally処理でendTransaction処理を実行するようにします。結論トランザクションを使うことで、データの整合性をコントロールできるようになります。質の高いアプリを作るためにも、ぜひ利用していきましょう。