【Kotlin/RoomDataBase】OnConflictStrategyの使い方と設定方法!
この記事からわかること
- Android Studio/KotlinでRoomデータベースの使い方
- OnConflictStrategyで設定できる値
- InsertやUpdate時にコンフリクトが発生した場合の対処方法
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Narwhal Feature Drop
- Kotlin:2.1.10
- Room:2.7.2
- AGP:8.9.2
- Gradle:8.11.1
- Mac M1:Sequoia 15.6.1
RoomのOnConflictStrategyとは?
RoomのOnConflictStrategyはデータベースにデータをInsertやUpdateする際に同じキーが既に存在(コンフリクトが発生)する場合の挙動を設定するための列挙型です。指定方法は@Insertや@Updateアノテーションの引数onConflictにOnConflictStrategy型で値を渡すだけです。
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(user: User): Long
@Update(onConflict = OnConflictStrategy.IGNORE)
fun update(user: User)
設定値の種類
設定できる値は以下のとおりです。FAILとROLLBACKは既にDeprecatedになっておりABORTへの置き換えが推奨されています。
| Strategyの種類 | 挙動 |
|---|---|
| ABORT | トランザクションを中止しロールバック |
| FAIL | トランザクションを失敗させる ※Deprecated:ABORT推奨 |
| IGNORE | コンフリクトが発生しても無視し、処理を継続する Insertなら-1が返る |
| REPLACE | 古いデータを置き換える |
| ROLLBACK | トランザクションをロールバック ※Deprecated:ABORT推奨 |
@Insertや@Updateアノテーションのデフォルト値はABORTになっているようです。
@Upsertであれば更新、なければ追加する
@Upsertアノテーションを使用することでデータがあれば更新、なければ追加することも可能です。
@Upsert
fun upsert(user: User)
またRoomの@Insertでは返り値に明示的にLongを指定することで追加したアイテムのIDを取得することができましたが、@UpsertではList<Long>と指定することで追加したIDを取得することが可能です。ただあくまでも「追加したID」を取得できるだけで、更新されたアイテムは-1が返ってくるので注意してください。
@Upsert
fun upsert(user: User): List<Long>
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。






