Android + Roomで複数テーブル間のトランザクションを張る

Androidの実装でSQLite + Roomを利用する際、複数テーブル間でトランザクションを張ることがあったのでその備忘録です。

環境

Kotlin 1.5.10
Room 2.3.0

実装方法

AppDataBase.runInTransactionブロック内で更新処理を行うことで実現できます。

private val database: AppDataBase = application.database
private val scope = CoroutineScope(Dispatchers.IO)

try {
  database.runInTransaction {
    // userテーブル更新
    userRepository.update(userData)
    // itemテーブル更新
    itemRepository(itemData)
  }
} catch (e: Exception) {
  /* error handling */
}

ブロック内でsuspend functionを利用する場合は、runInTransactionの代わりにwithTransactionを利用する必要があります。

try {
  database.withTransaction {
    // userテーブル削除 (suspend function)
    userRepository.delete(userData)
    // itemテーブル削除 (suspend function)
    itemRepository.delete(itemData)
  }
} catch (e: Exception) {
  /* error handling */
}

参考記事

https://stackoverflow.com/questions/48113259/room-database-transaction-rollback

https://stackoverflow.com/questions/63677245/suspend-method-inside-runintransaction-block

 

 


--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。