LoginSignup
10
6

More than 3 years have passed since last update.

【Android】Room DaoクラスのアノテーションとOnConflictStrategyまとめ

Posted at

概要

Androidアプリにてデータベース(SQLite)へのデータ保存・取得処理を実現する際に利用されるRoom

そのRoomを利用する手順 1 として

  1. Roomをセットアップする(build.gradleに依存関係を追記)
  2. RoomDatabaseクラス(データベースへのアクセスポイント)を作成する
  3. Entityクラス(データベース内のテーブル ≒ 格納するデータ定義)を作成する
  4. Daoクラス(データベースにアクセスに使用するメソッドを持つ)を作成する

以上が挙げられますが、今回は 4.Daoクラスを作成する を取り上げ、
その中でもDaoクラスのメソッドに指定する@InsertなどのアノテーションOnConflictStrategyをメインにまとめていきます。

※ メモ兼ねての投稿で調査不十分な箇所があるかと存じますが、ご指摘いただけますと幸いです

Daoクラスのメソッドに指定するアノテーション

いきなりですが、Daoクラスの作成例を以下に示します。
Entityという名前のEntityクラスを作成した前提
Entityはメンバとしてidを含む想定

@Dao
interface EntityDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(entity: Entity): Long

    @Update(onConflict = OnConflictStrategy.REPLACE)
    fun update(entity: Entity): Int

    @Delete
    fun delete(entity: Entity): Int

    // @Queryに指定しているSQLは一例
    @Query("SELECT * from table_name WHERE id = :id")
    fun findById(id: String): Entiry?

}

上記の通り各メソッドにアノテーションを付与することで、Roomがよしなに実装してくれます。

アノテーションの一覧はこちら。

アノテーション 説明 指定できる戻り値 備考
@Insert 引数で渡したEntity(単体/配列/リスト)を挿入する Void(Unit)、Long、Long[]、List<Long> Long値は挿入されたデータに対応するRowId(=データを追加するごとに自動的に値が設定される非表示のカラム 2 3
@Update 引数で渡したEntity(単体/配列/リスト)を主キーを元に更新する Void(Unit)、Int(更新された行数)
@Delete 引数で渡したEntity(単体/配列/リスト)を主キーを元に削除する Void(Unit)、Int(削除された行数)
@Query アノテーションの"value"に対しクエリを指定して読み書き処理を実行できる Void (Unit)をはじめとしたクエリに応じた戻り値 コンパイル時に検証されるため、クエリに問題があるとコンパイルエラーが発生。クエリの戻り値と対応列名とが一致しない場合、一部のフィールド名だけが一致している場合は警告を、1つも一致しない場合は、エラーが表示される

※ 詳細な情報はRoom DAO を使用してデータにアクセスする  |  Android デベロッパーを参照のこと

OnConflictStrategyとは

さて、先ほどのDaoクラスのサンプルで@Insertと@Updateには onConflict= 指定がありました。

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(entity: Entity): Long

    @Update(onConflict = OnConflictStrategy.REPLACE)
    fun update(entity: Entity): Int

このonConflict=にOnConflictStrategyの指定を行うことで、データ挿入/更新時にコンフリクト(重複)が発生した場合の挙動を指定できます。

指定できるOnConflictStrategyの一覧はこちら。

Strategyの種類 挙動 備考
ABORT トランザクションを中止しロールバックする @Insert、@UpdateでのデフォルトはABORT
FAIL トランザクションを失敗させる Deprecatedなので、代わりにABORTを使うこと
IGNORE コンフリクトが発生しても無視し、処理を継続する @Insertの場合:コンフリクトが発生すると挿入が実行されず-1が返る(RowIdがないため)
REPLACE 古いデータを置き換える
ROLLBACK トランザクションをロールバックする Deprecatedなので、代わりにABORTを使うこと

備考にも記載していますが、 @Insert@Updateでのデフォルトは ABORT です。
=> @Insert()@Update()のようにonConflict未指定の場合は ABORT が適用されます。

※ 詳細な情報はOnConflictStrategy  |  Android デベロッパーを参照のこと

参考

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6